オブジェクトDeclaringType
のプロパティ(実際にこのメンバーを宣言するクラスを取得する) がプロパティ (のこのインスタンスを取得するために使用されたクラス オブジェクトを取得する)と等しいかどうかを確認する必要があります。MemberInfo
DeclaringType
ReflectedType
MemberInfo
それに加えて、プロパティも確認する必要があります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;
}
}