2010-09-28 14 views
10

¿Cómo puedo almacenar delegados (named, anonymous, lambda) en una lista genérica? Básicamente, estoy tratando de construir un diccionario de delegados desde donde pueda acceder a un delegado almacenado utilizando una clave, ejecutarlo y devolver el valor a pedido. ¿Es posible hacerlo en C# 4? Alguna idea para lograrlo? Nota: La lista heterogénea es preferible donde puedo almacenar cualquier tipo de delegados.Cómo almacenar delegados en una lista

+0

Dictionary ? –

+2

Nota heterogénea es una mala idea, ¿cómo sabrá qué parámetros debe pasar el delegado –

Respuesta

16

¿No es suficiente System.Collections.Generic.Dictionary<string, System.Delegate>?

+0

de esa manera no puedo almacenar delegados anónimos o lambdas. –

+9

@Anindya Chatterjee: Sí, puedes: 'dic.Add (" acción ", nueva Acción (() => Console.WriteLine (" acción llamada! ")));' – Timwi

+0

Ya, gracias por recordarme, estoy totalmente se olvidó de --new Action (() => Console.WriteLine ("acción llamada!")) - –

0
 Dictionary<string, Func<int, int>> fnDict = new Dictionary<string, Func<int, int>>(); 
     Func<int, int> fn = (a) => a + 1; 
     fnDict.Add("1", fn); 
     var re = fnDict["1"](5); 
+0

Estoy buscando una solución más genérica donde no haya restricciones para los delegados. –

6

Bueno, aquí hay un ejemplo sencillo:

class Program 
{ 
    public delegate double MethodDelegate(double a); 

    static void Main() 
    { 
     var delList = new List<MethodDelegate> {Foo, FooBar}; 


     Console.WriteLine(delList[0](12.34)); 
     Console.WriteLine(delList[1](16.34)); 

     Console.ReadLine(); 
    } 

    private static double Foo(double a) 
    { 
     return Math.Round(a); 
    } 

    private static double FooBar(double a) 
    { 
     return Math.Round(a); 
    } 
} 
+0

No estoy buscando este tipo de solución. La solución solo requiere un tipo especial de delegado designado, no otros. –

2
public delegate void DoSomething(); 

    static void Main(string[] args) 
    { 
     List<DoSomething> lstOfDelegate = new List<DoSomething>(); 
     int iCnt = 0; 
     while (iCnt < 10) 
     { 
      lstOfDelegate.Add(delegate { Console.WriteLine(iCnt); }); 
      iCnt++; 
     } 

     foreach (var item in lstOfDelegate) 
     { 
      item.Invoke(); 
     } 
     Console.ReadLine(); 
    } 
Cuestiones relacionadas