parameter generic delegate clase array c# generics delegates

c# - generic - ¿Puedo usar una Lista<T> como una colección de punteros de método?(DO#)



generics c# (7)

Quiero crear una lista de métodos para ejecutar. Cada método tiene la misma firma. Pensé en colocar delegados en una colección genérica, pero sigo recibiendo este error:

''método'' es una ''variable'' pero se usa como un ''método''

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); }

¿Alguna idea sobre cómo lograr esto? ¡Gracias!


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


Me gusta más la implementación de Khoth, pero creo que lo que está causando el error del compilador es que no echas el 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.


Necesita convertir el object en la lista a BinaryOp o, mejor, usar un parámetro de tipo más específico para la lista:

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); }


No lo he probado pero usando un tipo List <Action <t >> debería ser capaz de hacerlo.


Pídales que implementen una interfaz común, digamos IExecuteable, y luego una Lista <IExecutable>

Además, utilizando 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; } }


Usando .NET 3.0 (¿o 3.5?) Tienes delegados genéricos.

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)


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));