1

给定以下代码:

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 是否表示覆盖基类中另一个的方法声明?

另一个问题中,观察到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 的成员。

4

2 回答 2

4

遮蔽方法的virtual方法将在 中VtableLayoutMask设置标志Attributes

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

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

于 2013-07-12T20:14:57.623 回答
1

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

如果你说

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

然后你可以检查是否

derivedMethodInfo.GetBaseDefinition() == derivedMethodInfo

或不。请参阅文档以了解GetBaseDefinition()他们也有代码示例的地方。

于 2013-07-12T20:52:26.160 回答