给出以下代码:
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的成员。
答案 0 :(得分:4)
隐藏virtual
方法的方法会在VtableLayoutMask
中设置Attributes
标记。
请注意,普通的virtual
方法(与基类型没有相似的名称)也会设置此标志。
此标志似乎表示该方法在VTable中引入了一个新条目。
答案 1 :(得分:1)
有一个更具体的类MethodInfo
,它派生自MemberInfo
。请注意,并非所有类型的成员都可以是虚拟的(例如,字段不能)。
如果你说
var derivedMethodInfo = typeof(Derived).GetMethod("Method");
然后你可以检查是否
derivedMethodInfo.GetBaseDefinition() == derivedMethodInfo
是不是。请参阅documentation for GetBaseDefinition()
,他们也有代码示例。