Вы должны проверить, если 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;
}
}