список динамических функций и их динамический вызов - PullRequest
20 голосов
/ 16 ноября 2011

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

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

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

Как это сделать в C #4

Ответы [ 3 ]

20 голосов
/ 16 ноября 2011

Вы можете создать список экземпляров делегатов, используя соответствующий тип делегата для каждого метода.

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")
3 голосов
/ 16 ноября 2011

Здесь вам на самом деле не нужна сила 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 голосов
/ 16 ноября 2011
    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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...