Erkennen Sie, ob ein Typ in C# von einer generischen Basisklasse erbt
Bei der Programmierung ist es oft notwendig, die Beziehungen zwischen Klassen zu bestimmen (insbesondere wenn es um Vererbung geht). Beim Umgang mit generischen Klassen mit Typparametern kann die Validierung der Vererbung über Standardmethoden jedoch schwierig sein.
Frage:
Angenommen, Sie haben die folgenden generischen und abgeleiteten Klassen:
<code class="language-csharp">public class GenericClass<T> : GenericInterface<T> { } public class Test : GenericClass<SomeType> { }</code>
Sie möchten überprüfen, ob ein bestimmtes Type-Objekt (z. B. typeof(Test)
) einen von GenericClass
geerbten Typ darstellt. Die Verwendung von typeof(Test).IsSubclassOf(typeof(GenericClass))
schlägt jedoch fehl, da die generischen Typparameter nicht berücksichtigt werden.
Lösung:
Um dieses Problem zu lösen, können Sie den folgenden Code verwenden, um zu bestimmen, ob der Typ von der generischen Basisklasse abgeleitet ist:
<code class="language-csharp">static bool IsSubclassOfRawGeneric(Type generic, Type toCheck) { while (toCheck != null && toCheck != typeof(object)) { var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck; if (generic == cur) { return true; } toCheck = toCheck.BaseType; } return false; }</code>
Diese Methode bestimmt, ob toCheck
direkt oder indirekt von generic
erbt, indem sie die Vererbungskette durchläuft und die Basistypen vergleicht. Es verarbeitet nicht-generische und generische Typen, indem es das Vorhandensein des IsGenericType
-Attributs prüft und die Definition des generischen Typs abruft.
Mit diesem Ansatz können Sie unabhängig von den angegebenen Typparametern genau bestimmen, ob ein Typ von einer generischen Basisklasse abgeleitet ist.
Anwendungsbeispiel:
<code class="language-csharp">bool result = IsSubclassOfRawGeneric(typeof(GenericClass<>), typeof(Test)); // result will be true</code>
Das obige ist der detaillierte Inhalt vonWie kann ich feststellen, ob ein Typ eine generische Basisklasse in C#erbt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!