动态函数列表并动态调用它们

时间:2011-11-16 13:26:28

标签: c# .net c#-4.0 dynamic

我希望能够在List中存储各种静态方法,然后查找它们并动态调用它们。

每个静态方法都有不同数量的args,类型和返回值

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

我希望有一个List,我可以将它们全部添加到:

List<dynamic> list

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

以后:

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

如何在C#4中执行此操作?

3 个答案:

答案 0 :(得分:20)

您可以使用适当的委托类型为每个方法创建委托实例列表。

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")

答案 1 :(得分:3)

你实际上不需要dynamic这里的力量,你可以用简单的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);
    }
}

(嗯,你需要一个演员表,不过你需要以某种方式知道每个存储方法的签名)

答案 2 :(得分: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);