2008-09-25 14 views
6

Quiero crear una lista de métodos para ejecutar. Cada método tiene la misma firma. pensé en poner los delegados en una colección genérica, pero me siguen dando este error:¿Puedo utilizar una lista <T> como una colección de punteros de método? (C#)

'method' is a 'variable' but is used like a 'method'

En teoría, esto es lo que me gustaría hacer:

List<object> methodsToExecute; 

int Add(int x, int y) 
{ return x+y; } 

int Subtract(int x, int y) 
{ return x-y; } 

delegate int BinaryOp(int x, int y); 

methodsToExecute.add(new BinaryOp(add)); 
methodsToExecute.add(new BinaryOp(subtract)); 

foreach(object method in methodsToExecute) 
{ 
    method(1,2); 
} 

Cualquier ideas sobre cómo llevar a cabo ¿esta? Gracias!

Respuesta

15

, es necesario especificar la object en la lista a un BinaryOp, o, mejor, usar un parámetro de tipo más específico de la lista: (¿o 3,5)

delegate int BinaryOp(int x, int y); 

List<BinaryOp> methodsToExecute = new List<BinaryOp>(); 

methodsToExecute.add(Add); 
methodsToExecute.add(Subtract); 

foreach(BinaryOp method in methodsToExecute) 
{ 
    method(1,2); 
} 
0

tener a todos ellos implementan de interfaz común, por ejemplo IExecuteable, y luego tener una lista < IExecutable>

Además, utilizando los delegados:

class Example 
{ 
    public delegate int AddDelegate(int x, int y); 

    public List<AddDelegate> methods = new List<AddDelegate>(); 

    int Execute() 
    { 
     int sum = 0; 
     foreach(AddDelegate method in methods) 
     { 
      sum+=method.Invoke(1, 2); 
     } 
     return sum; 
    } 
} 
0

no lo he probado, pero utilizando una Lista de Acción < < t >> tipo debería ser capaz de hacerlo.

3

El uso de .NET 3.0 tiene genérico delegados.

Prueba esto:

List<Func<int, int, int>> methodsToExecute = new List<Func<int, int, int>>(); 

methodsToExecute.Add(Subtract); 

methodsToExecute.Add[0](1,2); // equivalent to Subtract(1,2) 
+0

No debería ser la última línea: methodsToExecute [0] (1,2); o incluso beeter: int n = methodsToExecute [0] (1,2); –

2
List<Func<int, int, int>> n = new List<Func<int, int, int>>(); 
      n.Add((x, y) => x + y); 
      n.Add((x, y) => x - y); 
      n.ForEach(f => f.Invoke(1, 2)); 
1

me gusta la aplicación de Khoth mejor, pero creo que lo que está causando el error del compilador es que no desechan método a un BinaryOp antes de intentar invocarlo. En su ciclo foreach es simplemente un "objeto". Cambie su foreach para que se parezca a Khoth y creo que funcionaría.

1

Siempre que he tenido la tentación de hacer algo como esto, he encontrado que generalmente es mejor refactorizar tu diseño para usar el patrón de comando, especialmente porque todos tus métodos tienen los mismos parámetros. De esta manera, permite mucha más flexibilidad.

Cuestiones relacionadas