将B(C(),D())转换为(c,d)=> B(()=> c(),()=> d()) - 从MethodInfos生成委托包装器?

时间:2010-10-27 07:12:25

标签: c# .net reflection methods delegates

最终,我期待基于反射的方法为方法B(C(),D())创建委托包装器 - 对于某些类似(c,d)=> B(() =&以及c(),()=> d())

第一个问题 - 鉴于你有一个Methodinfo,创建一个与该方法签名相对应的委托类型(通过反射)有哪些注意事项?

您是否参考了执行此操作的任何开源项目的代码块? :P

更新:以下是为methodinfo Builds a Delegate from MethodInfo?创建委托的一般方法 - 我认为递归包装参数部分是我周末要解决的问题。< / p>

2 个答案:

答案 0 :(得分:0)

使用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");

答案 1 :(得分:0)

我设法从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

不确定它有多有用,但是......