2

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

4

1 回答 1

1

MSDN 关于Type.GetMethod 函数的 types 参数

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

您传递一个空数组,该数组指示“不带参数的方法”。但正如您所说,“B 具有 [a] 类型的 int 参数。”

这将起作用:

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

如果我理解正确,Ldarg_S将加载您方法的百分之一参数,类似于 Ldarg_0:

gen.Emit(OpCodes.Ldarg_S, 100);

加载一个常数值使用 Ldc_I4

gen.Emit(OpCodes.Ldc_I4, 100);
于 2009-09-06T16:19:51.240 回答