2010-09-28 7 views
10

Comment puis-je stocker des délégués (nommés, anonymes, lambda) dans une liste générique? Fondamentalement, j'essaye de construire un dictionnaire de délégué d'où je peux accéder à un délégué stocké en utilisant une clé et l'exécuter et retourner la valeur sur demande. Est-il possible de faire en C# 4? Une idée pour l'accomplir? Note: Une liste hétérogène est préférable lorsque je peux stocker n'importe quel type de délégués.Comment stocker des délégués dans une liste

+0

Dictionnaire ? –

+2

Remarque hétérogène est une mauvaise idée, comment allez-vous savoir quels paramètres vous devez passer le délégué –

Répondre

16

Est-ce que System.Collections.Generic.Dictionary<string, System.Delegate> ne suffit pas?

+0

de cette façon je ne peux pas stocker les délégués anonymes ou lambdas. –

+9

@Anindya Chatterjee: Oui, vous pouvez: 'dic.Add (" action ", nouvelle Action (() => Console.WriteLine (" action appelée! ")));' – Timwi

+0

Ya, merci de me le rappeler, je totalement oublié à propos de --new Action (() => Console.WriteLine ("action appelée!")) - –

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

Je suis à la recherche d'une solution plus générique où il n'y a pas de contraintes pour les délégués. –

6

Eh bien, voici un exemple simple:

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

Je ne cherche pas ce genre de solution. La solution prend seulement un type spécial de délégué nommé, pas d'autres. –

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