Подтвердить что ты не робот

Список динамических функций и динамический вызов их

Я хотел бы иметь возможность хранить различные статические методы в списке, а затем искать их и динамически вызывать.

Каждый из статических методов имеет различное количество аргументов, типов и возвращаемых значений

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?

4b9b3361

Ответ 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);