我正在使用 Mono.Cecil 生成一个程序集,该程序集包含一个派生类,该类覆盖导入的基类中的特定方法。覆盖方法是“隐式”覆盖。问题是我无法弄清楚如何将其指定为覆盖。
我正在使用以下代码来创建覆盖方法。
void CreateMethodOverride(TypeDefinition targetType,
TypeDefinition baseClass, string methodName, MethodInfo methodInfo)
{
// locate the matching base class method, which may
// reside in a different module
MethodDefinition baseMethod = baseClass
.Methods.First(method => method.Name.Equals(methodName));
MethodDefinition newMethod = targetType.Copy(methodInfo);
newMethod.Name = baseMethod.Name;
newMethod.Attributes = baseMethod.Attributes;
newMethod.ImplAttributes = baseMethod.ImplAttributes;
newMethod.SemanticsAttributes = baseMethod.SemanticsAttributes;
targetType.Methods.Add(newMethod);
}
据我了解,隐式覆盖必须具有与继承方法相同的签名。使用上面的代码,当我在 Reflector 中查看生成的方法时,基类和派生类方法具有完全相同的签名,即“public virtual void f(int param)”。
我尝试删除显式的“虚拟”属性,但派生方法最终成为“public void f(int param)”。
如何让派生方法具有正确的“public override void f(int param)”签名?
注意:我有一个扩展方法(“TypeDefinition.Copy”),它克隆一个 MethodInfo 并通过导入所有引用的类型等返回一个 MethodDefinition。