gpt4 book ai didi

c# - 如何判断 MemberInfo 是否表示覆盖

转载 作者:太空宇宙 更新时间:2023-11-03 20:14:46 24 4
gpt4 key购买 nike

给定以下代码:

public class Base {
public virtual void Method() { }
}

public class Derived : Base {
public override void Method() { }
}

...

var baseMethodInfo = typeof(Base).GetMember("Method")[0];
var derivedMethodInfo = typeof(Derived).GetMember("Method")[0];

是否可以确定 derivedMethodInfo 是否表示覆盖基类中另一个方法声明的方法声明?

another question据观察,如果 Method 在基类中被声明为抽象的(并且未实现),则 derivedMethodInfo.DeclaringType 会变成 Base,这在阅读@EricLippert 的评论后是有道理的。我注意到在本示例中,由于派生类重新声明了方法,即 derivedMethodInfo.DeclaringType == derivedMethodInfo.ReflectedType,即。派生。

baseMethodInfo 和 derivedMethodInfo 之间似乎没有任何联系,只是它们的名称相同并且它们各自的声明类型出现在同一个继承链中。有没有更好的连接方式?

我问的原因是似乎没有办法通过反射(reflection)来区分前面的例子和下面的例子:

public class Base {
public virtual void Method() { }
}

public class Derived : Base {
public new void Method() { }
}

在这种情况下,派生类也声明并反射(reflect)了一个名为 Method 的成员。

最佳答案

隐藏 virtual 方法的方法将在 Attributes 中设置 VtableLayoutMask 标志。

请注意,普通的 virtual 方法(没有与基类型相似的名称)也将设置此标志。

此标志的出现表明该方法在 VTable 中引入了一个新条目。

关于c# - 如何判断 MemberInfo 是否表示覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17623188/

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