2010-09-28 11 views
10

Come posso archiviare i delegati (denominati, anonimi, lambda) in un elenco generico? Fondamentalmente sto provando a costruire un dizionario delegato da dove posso accedere a un delegato memorizzato usando una chiave ed eseguirlo e restituire il valore su richiesta. È possibile fare in C# 4? Qualche idea per realizzarlo? Nota: la lista eterogenea è preferibile dove posso memorizzare qualsiasi tipo di delegato.Come memorizzare i delegati in un elenco

+0

Dictionary ? –

+2

Nota eterogenea è una cattiva idea, come farai a sapere quali parametri devi passare al delegato –

risposta

16

Non è sufficiente System.Collections.Generic.Dictionary<string, System.Delegate>?

+0

in questo modo non posso memorizzare delegati anonimi o lambda. –

+9

@Anindya Chatterjee: Sì, è possibile: 'dic.Add (" action ", new Action (() => Console.WriteLine (" action called! ")));' – Timwi

+0

Ya, grazie per avermelo ricordato, I totally dimenticato aboutnew Action (() => Console.WriteLine ("action called!")) - –

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

Sto cercando una soluzione più generica dove non ci siano vincoli per i delegati. –

6

Bene, ecco un semplice esempio:

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

Non sto cercando questo tipo di soluzione. La soluzione richiede solo un tipo speciale di delegato chiamato, non altri. –

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(); 
    } 
Problemi correlati