Преобразовать B (C (), D ()) в (c, d) => B (() => c (), () => d ()) - Создание обертки делегатов из MethodInfos? - PullRequest
1 голос
/ 27 октября 2010

В конечном счете, я с нетерпением жду подхода, основанного на отражении, для создания оболочки-делегата для метода B (C (), D ()) - в некотором роде (c, d) => B (() => c (), () => d ())

Первый вопрос - Учитывая, что у вас есть Methodinfo, каковы соображения по созданию типа делегата (через отражение), который соответствует сигнатуре этого метода?

У вас есть ссылка на фрагмент кода любого проекта с открытым исходным кодом, который делает это?: P

Обновление: Вот общий способ создания делегата для methodinfo Сборка делегата из MethodInfo? - Я думаю, что рекурсивная упаковка части параметров - это нечтоМне нужно потренироваться на выходных.

Ответы [ 2 ]

0 голосов
/ 27 октября 2010

Мне удалось создать рабочий делегат из MethodInfo такого метода:

Метод и делегат:

public static int B(Func<int> c, Func<int> d) {
  return c() + d();
}

public delegate int TwoFunc(Func<int> c, Func<int> d);

Код:

MethodInfo m = typeof(Program).GetMethod("B");
TwoFunc d = Delegate.CreateDelegate(typeof(TwoFunc), m) as TwoFunc;
int x = d(() => 1, () => 2);
Console.WriteLine(x);

Выход:

3

Не уверен, насколько это полезно, хотя ...

0 голосов
/ 27 октября 2010

Используйте Expression для построения динамических методов.Вот пример по вашему вопросу.Я беру Console.Write(string s) в качестве примера.

    MethodInfo method = typeof(Console).GetMethod("Write", new Type[] { typeof(string) });
    ParameterExpression parameter = Expression.Parameter(typeof(string),"str");
    MethodCallExpression methodExp = Expression.Call(method,parameter);
    LambdaExpression callExp = Expression.Lambda(methodExp, parameter);
    callExp.Compile().DynamicInvoke("hello world");
...