2011-11-16 12 views
20

Vorrei poter memorizzare vari metodi statici in un elenco e in seguito cercarli e chiamarli dinamicamente.un elenco di funzioni dinamiche e chiamarle dinamicamente

Ognuno dei metodi statici ha un diverso numero di args, tipi e valori restituiti

static int X(int,int).... 
static string Y(int,int,string) 

mi piacerebbe avere una lista che io li posso aggiungere a:

List<dynamic> list 

list.Add(X); 
list.Add(Y); 

e più avanti:

dynamic result = list[0](1,2); 
dynamic result2 = list[1](5,10,"hello") 

Come fare questo in C# 4?

+2

+1, un diverso tipo di domanda. –

+0

+1, mi piace quello – Dennis

+1

Quello che stai cercando è il [modello di comando] (http://en.wikipedia.org/wiki/Command_pattern). Google che insieme a 'C#' e dovresti essere impostato. –

risposta

20

È possibile creare un elenco di istanze delegato, utilizzando un tipo di delegato appropriato per ciascun metodo.

var list = new List<dynamic> 
      { 
       new Func<int, int, int> (X), 
       new Func<int, int, string, string> (Y) 
      }; 

dynamic result = list[0](1, 2); // like X(1, 2) 
dynamic result2 = list[1](5, 10, "hello") // like Y(5, 10, "hello") 
+2

+1, per una risposta migliore. –

+0

grazie, questa tecnica ha funzionato perfettamente! –

3

In realtà non è necessario il potere di dynamic qui, si può fare con la semplice List<object>:

class Program 
{ 
    static int f(int x) { return x + 1; } 
    static void g(int x, int y) { Console.WriteLine("hallo"); } 
    static void Main(string[] args) 
    { 
     List<object> l = new List<object>(); 
     l.Add((Func<int, int>)f); 
     l.Add((Action<int, int>)g); 
     int r = ((Func<int, int>)l[0])(5); 
     ((Action<int, int>)l[1])(0, 0); 
    } 
} 

(bene, è necessario un cast, ma è necessario conoscere in qualche modo la firma del ciascuno dei metodi memorizzati comunque)

2
List<dynamic> list = new List<dynamic>(); 
     Action<int, int> myFunc = (int x, int y) => Console.WriteLine("{0}, {1}", x, y); 
     Action<int, int> myFunc2 = (int x, int y) => Console.WriteLine("{0}, {1}", x, y); 
     list.Add(myFunc); 
     list.Add(myFunc2); 

     (list[0])(5, 6); 
Problemi correlati