如何判断MemberInfo是否表示覆盖

时间:2013-07-12 20:08:10

标签: 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之间似乎没有任何连接,除了它们的名称相同且它们各自的声明类型出现在同一个继承链中。有没有更好的方法来建立连接?

我问的原因是,似乎没有办法通过反思来区分前面的例子和下一个例子:

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

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

在这种情况下,Derived类也声明并反映一个名为Method的成员。

2 个答案:

答案 0 :(得分:4)

隐藏virtual方法的方法会在VtableLayoutMask中设置Attributes标记。

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

此标志似乎表示该方法在VTable中引入了一个新条目。

答案 1 :(得分:1)

有一个更具体的类MethodInfo,它派生自MemberInfo。请注意,并非所有类型的成员都可以是虚拟的(例如,字段不能)。

如果你说

var derivedMethodInfo = typeof(Derived).GetMethod("Method");

然后你可以检查是否

derivedMethodInfo.GetBaseDefinition() == derivedMethodInfo
是不是。请参阅documentation for GetBaseDefinition(),他们也有代码示例。