我正在尝试使用 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);
}
这有效,除非我从两个都有同名方法的接口继承。显然,这是因为我没有给出该方法的完全限定名称。我不确定如何正确执行此操作。
更改methodToOverride.Name
为interfaceToOverride.FullName + "." + methodToOverride.Name
无效:发出时出现错误,“TypeLoadException:类没有实现。
使用DefineMethodOverride
部分工作,但由于某种原因,当我针对嵌套接口测试它时没有。此外,上面链接的文档明确表示不要这样做。
解决此问题的正确方法是什么?