2009-06-11 19 views
12

型インスタンスのGetMethod呼び出しから取得したMethodInfoオブジェクトが、型またはベースによって実装されているかどうかを確認しようとしています。例えばMethodInfoが基本メソッドのオーバーライドであるかどうかを調べる方法

:ToStringメソッドがfooクラスまたはしないで実施することができる

Foo foo = new Foo(); 
MethodInfo methodInfo = foo.GetType().GetMethod("ToString",BindingFlags|Instance); 

。私がfooの実装を取得しているかどうかを知りたいですか?

関連質問

Is it possible to tell if a .NET virtual method has been overriden in a derived class?

答えて

19

その​​プロパティを確認してください。

if (methodInfo.DeclaringType == typeof(Foo)) { 
    // ... 
} 
+1

+1一つだ:) –

+0

これは検査方法場合は動作しません。抽象的なものでもあります。ここに[説明](https://stackoverflow.com/a/45560768/5259296)があります。 –

1

DeclaringTypeプロパティを確認します。 ToStringメソッドがFooに由来する場合、DeclaringTypeはFoo型になります。

2

反射を使用する代わりに、はるかに高速な方法は代理人を使用することです! 特に、フレームワークの新しいバージョンでは、操作が非常に高速です。

public delegate string ToStringDelegate(); 

    public static bool OverridesToString(object instance) 
    { 
     if (instance != null) 
     { 
      ToStringDelegate func = instance.ToString; 
      return (func.Method.DeclaringType == instance.GetType()); 
     } 
     return false; 
    } 
1

あなたはMemberInfoオブジェクトの​​プロパティががこれを取得するために使用されたクラスオブジェクトを取得しますReflectedType財産(に等しい(​​が実際にこのメンバーを宣言するクラスを取得します)かどうかを確認する必要がありますMemberInfoのインスタンス)。

さらに、プロパティを確認する必要がありますIsAbstract。 「抽象的であることが」(だけでこのメンバーは、現在のクラス内のそれは実装だことはできません新しい宣言(を)であることを意味するので、それはtrueある場合は、検査方法は、間違いなく上書きではありません代わりに派生クラス)。ここで

を以下に拡張メソッドの使用方法の一例です:

Student student = new Student 
{ 
    FirstName = "Petter", 
    LastName = "Parker" 
}; 

bool isOverridden = student.GetType() 
    .GetMethod(
     name: nameof(ToString), 
     bindingAttr: BindingFlags.Instance | BindingFlags.Public, 
     binder: null, 
     types: Type.EmptyTypes, 
     modifiers: null 
    ).IsOverridden(); // ExtMethod 

if (isOverridden) 
{ 
    Console.Out.WriteLine(student); 
} 

拡張メソッド:

using System.Reflection; 

public static class MethodInfoHelper 
{ 
    /// <summary> 
    ///  Detects whether the given method is overridden. 
    /// </summary> 
    /// <param name="methodInfo">The method to inspect.</param> 
    /// <returns><see langword="true" /> if method is overridden, otherwise <see langword="false" /></returns> 
    public static bool IsOverridden(this MethodInfo methodInfo) 
    { 
     return methodInfo.DeclaringType == methodInfo.ReflectedType 
       && !methodInfo.IsAbstract; 
    } 
} 
+0

実際に** **抽象的なメソッドを再抽象化することができます。 ([sharplab](https://sharplab.io/#v2:EYLgtghgzgLgpgJwD4AEDMACFAmDAhaOAYQBtooBYAKAG9qMGtMA3ASwRgFcISsAWDAGUA9mDgBZODAAWwgCYAKAJT1GdKowwBfajqrV0GCMFgIIAYxhZcAJTjHTFmKwB2Ac1LkMIfIU9RKWlUGQwcYM0sMYWZEBFY5OH4hUQkpWUUlAG5dIA===)) – jnm2

+0

たぶん、あなたはOPのメソッドがオーバーライドであることを検出する方法ではなく、どのように検出するか尋ねthough-別の何かの話をしていますメソッドがオーバーライドされていること。 – jnm2

関連する問題