10

重複の可能性:
Reflection(C#)を使用してメソッドがオーバーライドされたかどうかを検出します

メソッドがオーバーライドであるかどうかを判断する方法はありますか?例えば

public class Foo
{
    public virtual void DoSomething() {}
    public virtual int GimmeIntPleez() { return 0; }
}

public class BabyFoo: Foo
{
    public override int GimmeIntPleez() { return -1; }
}

振り返って、オーバーライドであるかどうかBabyFooを判断することは可能ですか?GimmeIntPleez

4

2 に答える 2

13

に対してテストしMethodInfo.GetBaseDefinition()ます。関数がオーバーライドの場合、基本クラスで別のメソッドが返されます。そうでない場合は、同じメソッド オブジェクトが返されます。

派生クラスでオーバーライドされると、このインスタンスによって表されるメソッドが最初に宣言された直接または間接基本クラスのメソッドの MethodInfo オブジェクトを返します。

于 2010-06-16T18:11:52.047 に答える
4

MethodInfo.DeclaringTypeを使用して、メソッドがオーバーライドであるかどうかを判別できます(オーバーライドであると想定IsVirtual = true)。

ドキュメントから:

... BがAからの仮想メソッドMをオーバーライドする場合、基本的にこのメソッドを再定義(または再宣言)することに注意してください。したがって、BMのMethodInfoは、Aがこのメソッドが最初に宣言された場所である場合でも、宣言タイプをAではなくBとして報告します...

次に例を示します。

var someType = typeof(BabyFoo);
var mi = someType.GetMethod("GimmeIntPleez");
// assuming we know GimmeIntPleez is in a base class, it must be overriden
if( mi.IsVirtual && mi.DeclaringType == typeof(BabyFoo) )
    { ... }
于 2010-06-16T18:08:09.807 に答える