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

标签 c# reflection polymorphism

给定以下代码:

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/

相关文章:

c++ - 为什么我必须在 C++ 的派生类中重新声明被覆盖的函数?

c# - 如何在 Visual C++ 中将托管变量用作全局变量?

c# - iOS 不支持全局 PushAsync,请使用 NavigationPage

scala - 如何在不使用 Java 反射 API 的情况下从 HashMap 中获取对象?

Java参数具有不同的静态和动态类型?

java - 将调用接口(interface)实现的哪个对象方法

c# - 在 while 循环期间文件正在被另一个进程使用 (C#)

c# - 在c#(VS2015)中查看垃圾回收历史

c# - 如何在不使用Assembly.Load的情况下加载程序集?

c# - 创建一个新的 AnonymousType 实例