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"));

問題は、これがオーバーライドされたメソッドではなく、基本タイプのメソッドを呼び出すことです。

メソッドビルダーへの参照を、それを定義したタイプビルダーへの参照のみを持つようにする方法はありますか?または、'MethodInfo'オブジェクトを渡さずにILGeneratorを使用してメソッドを呼び出す方法はありますか?

4

1 に答える 1

1

フォローするかどうかはわかりませんが、仮想メソッドを呼び出すにはOpcodes.CallVirtを使用する必要があります。これにより、オーバーライドされたメソッドが自動的に呼び出されます。

于 2010-05-08T18:25:52.627 に答える