通常、同じタイプのメソッドを記述している別の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を使用してメソッドを呼び出す方法はありますか?