Вы должны проверить, если DeclaringType
свойство MemberInfo
объекта (DeclaringType
фактически получает класс, объявляющий этот элемент) равно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;
}
}
+1 Это одна :) –
Это не будет работать, если проверяемого метода также является абстрактным. Вот [объяснение] (https://stackoverflow.com/a/45560768/5259296). –