1

通常,当我想在另一个正在编写相同类型的方法的 ILGenerator 对象中调用动态方法时,我会执行以下操作:

generator.Emit(OpCodes.Ldarg_0); // reference to the current object
generator.Emit(OpCodes.Ldstr, "someArgument");
generator.Emit(OpCodes.Call, methodBuilder); //this methodbuilder is also defined on this dynamic type.

但是,我遇到了以下问题:我无法引用我要调用的方法的方法构建器,因为它是由另一个框架生成的(我只获得了对当前 TypeBuilder 的引用)。此方法在当前动态类型的基类中被定义为受保护的虚拟(并且在我无法获得引用的方法构建器上被覆盖),我可以通过这样做来获得对它的引用:

generator.Emit(OpCodes.Ldarg_0); // reference to the current object
generator.Emit(OpCodes.Ldstr, "someArgument");
generator.Emit(OpCodes.Call, baseType.GetMethod("SomeMethodDefinedInBaseClassThatWasOverridenInThisDynamicType"));

问题是这调用了基类型的方法,而不是覆盖的方法。

有什么方法可以让我引用一个只有对定义它的类型构建器的引用的方法构建器?或者有没有一种方法可以使用 ILGenerator 调用方法而无需将“MethodInfo”对象传递给它?

4

1 回答 1

1

不确定我是否遵循,但您需要使用 Opcodes.CallVirt 来调用虚拟方法。哪个应该自动调用被覆盖的方法。

于 2010-05-08T18:25:52.627 回答