gpt4 book ai didi

mono.cecil - 如何使用 Mono.Cecil 创建覆盖方法?

转载 作者:行者123 更新时间:2023-12-04 03:09:19 26 4
gpt4 key购买 nike

我正在使用 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。

最佳答案

在您的基类中,假设您生成以下方法:

public virtual void f(int);

你必须确保它有标志 IsVirtual设置为真。您还必须确保它具有标志 IsNewSlot = true , 以确保它在 virtual method table 中有一个新插槽.

现在,对于重写的方法,您要生成:
public override void f(int);

为此,您还需要具有 IsVirtual 的方法。 ,还要告诉它它不是一个新的虚方法,而是隐式覆盖了另一个,所以你必须让它 .IsReuseSlot = true .

并且因为您使用的是隐式覆盖,您还必须确保这两种方法都是 .IsHideBySig = true .

有了这一切,你应该有一个正确的覆盖方法。

关于mono.cecil - 如何使用 Mono.Cecil 创建覆盖方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8102041/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com