我希望能够在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中执行此操作?
答案 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);