2010-09-28 14 views
10

Jak mogę przechowywać delegatów (nazwanych, anonimowych, lambda) na liście ogólnej? Zasadniczo próbuję zbudować słownik delegatów, z którego mogę uzyskać dostęp do przechowywanego delegata za pomocą klucza i wykonać go i zwrócić wartość na żądanie. Czy można to zrobić w C# 4? Masz pomysł, żeby to osiągnąć? Uwaga: Preferowana jest lista heterogeniczna, w której mogę przechowywać każdego rodzaju delegatów.Jak przechowywać delegatów na liście?

+0

Dictionary ? –

+2

Uwaga heterogeniczny jest złym pomysłem, skąd będziesz wiedział, jakie parametry powinieneś przekazać delegatowi –

Odpowiedz

16

Czy System.Collections.Generic.Dictionary<string, System.Delegate> nie wystarczy?

+0

w ten sposób, że nie mogę przechowywać anonimowych delegatów ani lambd. –

+9

@Aindhya Chatterjee: Tak, możesz: 'dic.Add (" akcja ", nowa akcja (() => Console.WriteLine (" akcja nazwana! ")));' – Timwi

+0

Ya, dzięki za przypomnienie mi, całkowicie zapomniałem o - najnowszej akcji (() => Console.WriteLine ("akcja wywołana!")) - –

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

Szukam bardziej ogólnego rozwiązania, w którym nie ma żadnych ograniczeń dla delegatów. –

6

Cóż, oto prosty przykład:

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

Nie szukam tego rodzaju rozwiązania. Rozwiązanie wymaga tylko specjalnego rodzaju delegata, a nie innych. –

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