2011-10-10 14 views
10

Me preguntaba si puede crear una matriz o una lista <> que contenga métodos. No quiero usar un interruptor o muchas declaraciones if.Matriz que contiene métodos

Gracias

+0

C# - ver el título –

+0

posible duplicado de [Cómo almacenar los delegados en una lista] (http: // stackoverflow. com/questions/3813261/how-to-store-deletes-in-a-list) – xanatos

Respuesta

6

Sí, es posible tener una matriz o lista de este tipo. Dependiendo del número de parámetros de entrada o de salida, que tendría que utilizar algo así como

List<Func<T1, T2, TReturn>> 

una instancia de tipo Func<T1, T2, TReturn> es un método como

TResult MyFunction(T1 input1, T2 input2) 

Take a look at the MSDN.

11

Hay que ir

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

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

¿Por qué está el 'Invoke()' aquí? ¿No puedes hacer 'a()'? –

+1

@ Vilx- Sí, puedes usar 'a()'. Y no necesita una pesada 'Lista ' para esto. Puedes hacer 'new Action [] {() => MyMethod(),() => MyMethod2()};' –

+0

explica lo que quieres decir con ListT –

1

Si usted está tratando de reemplazar un interruptor luego un diccionario podría ser más útil que una lista

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

methods["method2"](); 

Considero que este y el interruptor de declaraciones un olor de código y que a menudo pueden ser replaced by polymorphism.

+0

Eso depende de dónde quieras usar esto. ¿Qué pasa si intentas implementar el patrón de comando? Está perfectamente bien en tal caso. (también es mejor usar una lista) –

+0

¿Por qué es mejor usar una lista? –

+0

Dado que con el patrón de comando normalmente desea recorrer las devoluciones de llamada –

1

Tal vez usted quiere probar este u si no desea utilizar listas

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 
} 
Cuestiones relacionadas