Reflection.Emit动态创建方法

时间:2009-09-06 03:07:46

标签: reflection.emit

我想动态创建一些方法,它将接受单个参数 - 类A的实例,然后在传递的A实例中执行方法B.B具有int类型的参数。这是架构:

dynamicMethod(A a){
a.B(12);
}

这是我试过的:

DynamicMethod method = new DynamicMethod(string.Empty, typeof(void), new[] { typeof(A) }, typeof(Program));
MethodInfo methodB = typeof(A).GetMethod("B", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { }, null);
ILGenerator gen = method.GetILGenerator();

gen.Emit(OpCodes.Nop);
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_S, 100);
gen.Emit(OpCodes.Call, methodB);

但编译器告诉我CLR没有找到该方法。你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

关于the types parameter of the Type.GetMethod function的MSDN:

  

一个Type对象数组,表示要获取的方法的参数的数量,顺序和类型。

传递一个空数组,表示“不带参数的方法”。但正如你所说“B有一个int类型的参数。”

这将有效:

MethodInfo methodB = typeof(A).GetMethod(
            "B",
            BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
            null,
            new Type[] { typeof(int) }
            , null);

如果我理解正确Ldarg_S将加载方法的第100个参数,与Ldarg_0类似:

gen.Emit(OpCodes.Ldarg_S, 100);

要加载常量值,请使用Ldc_I4

gen.Emit(OpCodes.Ldc_I4, 100);