18

型インスタンスの GetMethod 呼び出しから取得した MethodInfo オブジェクトが、型またはそのベースによって実装されているかどうかを判断しようとしています。

例えば:

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

ToString メソッドは Foo クラスに実装されている場合とされていない場合があります。foo の実装を取得しているかどうかを知りたいですか?

関連する質問

.NET 仮想メソッドが派生クラスでオーバーライドされているかどうかを確認することはできますか?

4

4 に答える 4

21

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

if (methodInfo.DeclaringType == typeof(Foo)) {
   // ...
}
于 2009-06-11T17:06:05.987 に答える
5

リフレクションを使用する代わりに、デリゲートを使用する方がはるかに高速です。特に新しいバージョンのフレームワークでは、操作は非常に高速です。

    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;
    }
于 2011-08-13T20:20:23.087 に答える
1

DeclaringType プロパティを確認してください。ToString メソッドが Foo から取得された場合、DeclaringType は Foo 型になります。

于 2009-06-11T17:09:57.460 に答える
1

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

それに加えて、プロパティも確認する必要がありますIsAbstract。である場合true、検査されたメソッドは間違いなくオーバーライドされません。これは、「抽象的である」ということは、このメンバーが現在のクラス内でその実装 ( body )を持つことができない新しい宣言であることを意味するためです(ただし、代わりに派生クラス内でのみ)。

次に示す拡張メソッドの使用例を次に示します。

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;
    }
}
于 2017-08-08T06:26:41.277 に答える