Reflection.Emitを使用して、実行時に複数のインターフェイスから継承するクラスを発行しようとしていますが、どのインターフェイスを事前に知ることができません。
MSDN / TypeBuilder.DefineMethodOverrideによると:
基本クラスのメソッドをオーバーライドしたり、インターフェイスのメソッドを実装したりするには、オーバーライドまたは実装するメソッドと同じ名前とシグネチャを持つメソッドを発行するだけです。
インターフェイスメソッドをオーバーライドするコードは次のとおりです。
private void OverrideMethod(TypeBuilder typeBuilder,
Type interfaceToOverride,
MethodInfo methodToOverride)
{
// Create the method stub
MethodBuilder methodBuilder = typeBuilder.DefineMethod(
methodToOverride.Name,
MethodAttributes.Public
| MethodAttributes.HideBySig
| MethodAttributes.NewSlot
| MethodAttributes.Virtual
| MethodAttributes.Final,
CallingConventions.HasThis,
methodToOverride.ReturnType,
methodToOverride.GetParameters().Select(p => p.ParameterType).ToArray()
);
// Implement the overriding method
ILGenerator il = methodBuilder.GetILGenerator();
// ... a bunch of calls to il.Emit ...
// Return
il.Emit(OpCodes.Ret);
}
これは、同じ名前のメソッドを持つ2つのインターフェイスから継承する場合を除いて機能します。明らかに、これはメソッドに完全修飾名を付けていないためです。これを正しく行う方法がわかりません。
に変更methodToOverride.Name
してinterfaceToOverride.FullName + "." + methodToOverride.Name
も機能しませんでした:「TypeLoadException:クラスに実装がありません。
部分的に機能しDefineMethodOverride
ましたが、ネストされたインターフェイスに対してテストしたときに、何らかの理由で機能しませんでした。また、上記のリンク先のドキュメントには、これを行わないように明示的に記載されています。
この問題を回避するための正しいアプローチは何ですか?