【问题标题】:Call a dynamically generated method on a ILGenerator on the same type在同一类型的 ILGenerator 上调用动态生成的方法
【发布时间】:2011-02-17 04:46:35
【问题描述】:

通常,当我想在另一个正在编写相同类型的方法的 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"));

问题在于 this 调用的是基类型上的方法,而不是被覆盖的方法。

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

【问题讨论】:

    标签: c# .net cil reflection.emit opcodes


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2012-01-30
      相关资源
      最近更新 更多