【发布时间】:2022-05-13 19:02:22
【问题描述】:
我有一个正在构建动态方法的函数。作为此动态方法的一部分,它正在调用生成时已知的操作。作为一个最小的可重现示例,请考虑以下 C# 代码:
using System.Reflection.Emit;
static class Program {
static Action MakeAction(Action action) {
DynamicMethod method = new DynamicMethod("test", null, null);
ILGenerator generator = method.GetILGenerator();
generator.Emit(OpCodes.Call, action.Method);
generator.Emit(OpCodes.Ret);
return method.CreateDelegate<Action>();
}
static void Main() {
MakeAction(() => Console.WriteLine("hello"))();
}
}
当我运行它时,我得到一个 System.InvalidProgramException。这样做的正确方法是什么?
【问题讨论】:
-
你为什么要尝试使用反射来找出委托所指向的方法并直接调用它而不是仅仅调用委托?它似乎不必要地复杂且容易出错,并且给您提供了比您需要的更多的思考方式。如果您确实只想执行由methdoinfo定义的任意方法,为什么要接受委托而不是直接接受方法信息?
-
直接传递MethodInfo是个好主意,不知道为什么我没有想到。传递给它的 Action 要么来自另一个 DynamicMethod(可以作为 MethodInfo 传递),要么是一个 lambda。将 lambdas 更改为静态方法并使用该静态方法的 MethodInfo 是可行的,尽管它不太干净。
标签: c# cil dynamicmethod ilgenerator