2011-10-10 7 views
10

Mi chiedevo se è possibile creare una matrice o una lista <> che contenga metodi. Non voglio usare un interruttore o un sacco di istruzioni if.Matrice contenente metodi

Grazie

+0

C# - vedere il titolo –

+0

possibile duplicato di [Come conservare i delegati in un elenco] (http: // StackOverflow. it/questions/3813261/how-to-store-delegates-in-a-list) – xanatos

risposta

6

Sì, è possibile avere una tale varietà o di un elenco. A seconda del numero di parametri di ingresso o di uscita, utilizza qualcosa come

List<Func<T1, T2, TReturn>> 

un'istanza di tipo Func<T1, T2, TReturn> è un metodo come

TResult MyFunction(T1 input1, T2 input2) 

Take a look at the MSDN.

11

Ci si va

List<Action> list = new List<Action>(); 
list.Add(() => ClassA.MethodX(paramM)); 
list.Add(() => ClassB.MethodY(paramN, ...)); 

foreach (Action a in list) { 
    a.Invoke(); 
} 
+0

Perché 'Invoke()' qui? Non puoi semplicemente fare 'a()'? –

+1

@ Vilx- Sì, puoi usare 'a()'. E non hai bisogno di un pesante 'Elenco ' per questo. Puoi fare 'new Action [] {() => MyMethod() = (MyMethod2()};' –

+0

spiega cosa intendi per ListT –

1

Se si sta tentando di sostituire un interruttore poi un dizionario potrebbe essere più utile di un elenco

var methods = new Dictionary<string, Action>() 
       { 
        {"method1",() => method1() }, 
        {"method2",() => method2() } 
       }; 

methods["method2"](); 

considero questo e switch un odore di codice e spesso possono essere replaced by polymorphism.

+0

Dipende da dove vuoi usare questo. Cosa succede se si tenta di implementare lo schema di comando? In questo caso è perfettamente soddisfacente. (inoltre è meglio usare una lista) –

+0

Perché è meglio usare una lista? –

+0

Dato che con lo schema di comando in genere si desidera eseguire il ciclo delle chiamate di richiamata –

1

forse si vuole provare questo se u non vogliono utilizzare gli elenchi

public Action[] methods; 

private void methodsInArray() 
{ 

    methods= new Action[2]; 
    methods[0] = test ; 
    methods[1] = test1; 
} 

private void test() 
{ 
    //your code 
} 

private void test1() 
{ 
    //your code 
} 
Problemi correlati