Список динамических функций и динамический вызов их
Я хотел бы иметь возможность хранить различные статические методы в списке, а затем искать их и динамически вызывать.
Каждый из статических методов имеет различное количество аргументов, типов и возвращаемых значений
static int X(int,int)....
static string Y(int,int,string)
Я хотел бы иметь Список, который я могу добавить их все:
List<dynamic> list
list.Add(X);
list.Add(Y);
и позже:
dynamic result = list[0](1,2);
dynamic result2 = list[1](5,10,"hello")
Как это сделать в С# 4?
Ответы
Ответ 1
Вы можете создать список делегатов-экземпляров, используя соответствующий тип делегата для каждого метода.
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
Вам действительно не нужна сила 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);
}
}
(ну, вам нужно бросить, но вам все равно нужно знать подпись каждого из хранимых методов)
Ответ 3
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);