我想动态创建一些方法,它将接受单个参数 - 类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没有找到该方法。你能帮帮我吗?
答案 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);