给定以下代码:
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/