最终,我期待基于反射的方法为方法B(C(),D())创建委托包装器 - 对于某些类似(c,d)=> B(() =&以及c(),()=> d())
第一个问题 - 鉴于你有一个Methodinfo,创建一个与该方法签名相对应的委托类型(通过反射)有哪些注意事项?
您是否参考了执行此操作的任何开源项目的代码块? :P
更新:以下是为methodinfo Builds a Delegate from MethodInfo?创建委托的一般方法 - 我认为递归包装参数部分是我周末要解决的问题。< / p>
答案 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
不确定它有多有用,但是......