2011-11-16 12 views
20

Me gustaría poder almacenar varios métodos estáticos en una lista y luego buscarlos y llamarlos dinámicamente.una lista de funciones dinámicas y llamándolas dinámicamente

Cada uno de los métodos estáticos tiene un número diferente de args, tipos y devolver valores

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

me gustaría tener una lista que puedo añadir a todos ellos a:

List<dynamic> list 

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

y luego:

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

¿Cómo hacer esto en C# 4?

+2

+1, un tipo diferente de pregunta. –

+0

+1, me gusta esa – Dennis

+1

Lo que estás buscando es el [patrón de comando] (http://en.wikipedia.org/wiki/Command_pattern). Google que junto con 'C#' y usted debe establecerse. –

Respuesta

20

Puede crear una lista de instancias delegadas, utilizando un tipo de delegado apropiado para cada método.

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, para una mejor respuesta. –

+0

gracias, esta técnica funcionó a la perfección! –

3

En realidad no necesita el poder de dynamic aquí, se puede hacer con una simple 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); 
    } 
} 

(así, necesita un yeso, pero hay que saber de alguna manera la firma del cada uno de los métodos almacenados de todos modos)

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); 
Cuestiones relacionadas