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];

派生メソッド情報が、基本クラスで別のメソッド宣言をオーバーライドするメソッド宣言を表しているかどうかを判断することは可能ですか?

別の質問ではMethod、基本クラスで抽象宣言されている (実装されていない) ことが観察されました。この例では、派生クラスがメソッドを再宣言していることに気付きました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 に答える