Sie müssen prüfen, ob DeclaringType
Eigenschaft MemberInfo
Objekt (DeclaringType
tatsächlich die Klasse erhält, die dieses Mitglied erklärt) gleichReflectedType
Eigenschaft (, die das Klassenobjekt wird, der verwendet wurde, dies zu erhalten Instanz von MemberInfo
).
Außerdem müssen Sie auch die Eigenschaft überprüfen IsAbstract
. Wenn es true
, dann ist die geprüfte Methode ist definitiv nicht außer Kraft gesetzt, weil „abstrakt zu sein“ bedeutet, dass dieses Element eine neue Erklärung, die nicht haben kann es Implementierung ist (Körper) innerhalb aktueller Klasse (aber nur in abgeleitete Klassen). Hier
ist ein Beispiel für die Verwendung der Erweiterungsmethode unten angegeben:
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);
}
Erweiterungsmethode:
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 Das ist die ein :) –
Dies wird nicht, wenn die inspizierte Methode funktioniert ist auch eine abstrakte. Hier ist die [Erklärung] (https://stackoverflow.com/a/45560768/5259296). –