Eine effektive Methode in C#, um genau zu bestimmen, ob ein Typ ein Subtyp eines anderen Typs ist
Beim Umgang mit Typen in C# müssen Sie häufig die Beziehung zwischen Typen bestimmen. Ein häufiger Bedarf besteht darin, zu überprüfen, ob ein Typ eine Unterklasse eines anderen Typs ist, oder genauer gesagt, ein Untertyp dieser Klasse.
IsSubclassOf: Teilweise Wahrheit
Die MethodeType.IsSubclassOf
bietet eine Möglichkeit, direkt zu überprüfen, ob ein Typ eine Unterklasse eines anderen Typs ist:
<code class="language-csharp">typeof(SubClass).IsSubclassOf(typeof(BaseClass)); // 返回 true</code>
Dieser Ansatz schlägt jedoch fehl, wenn die beiden Typen gleich sind:
<code class="language-csharp">typeof(BaseClass).IsSubclassOf(typeof(BaseClass)); // 返回 false</code>
IsAssignableFrom: Breiter, aber nicht perfekt
DerType.IsAssignableFrom
-Ansatz löst dieses Problem, hat aber auch seine eigenen Nachteile. Während es genau anzeigt, dass eine Unterklasse oder derselbe Typ ein Untertyp ist, kann es auch falsch positive Ergebnisse für nicht verwandte Typen zurückgeben:
<code class="language-csharp">typeof(BaseClass).IsAssignableFrom(typeof(DerivedClass)); // 返回 true typeof(BaseClass).IsAssignableFrom(typeof(BaseClass)); // 返回 true typeof(int[]).IsAssignableFrom(typeof(uint[])); // 返回 true</code>
ist und als: objektorientiert, aber mit Einschränkungen
Die Schlüsselwörteris
und as
können auch zur Typprüfung verwendet werden, sie wirken sich jedoch auf Objektinstanzen und nicht auf Typen selbst aus. Dies schränkt ihre Anwendbarkeit in der statischen Codeanalyse ein.
Fazit: Kombination von Methoden zur Verbesserung der Genauigkeit
Leider erfasst keine einzige integrierte Methode das Konzept der Subtypprüfung vollständig, ohne falsch positive Ergebnisse zu liefern oder Objektverweise zu erfordern. Am zuverlässigsten ist es, die Type.IsSubclassOf
-Methode mit einer expliziten Gleichheitsprüfung zu kombinieren:
<code class="language-csharp">bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant) { return potentialDescendant.IsSubclassOf(potentialBase) || potentialDescendant == potentialBase; }</code>
Diese benutzerdefinierte Methode bietet eine präzise und genaue Möglichkeit, zu bestimmen, ob ein Typ ein Untertyp eines anderen Typs ist, einschließlich der Groß-/Kleinschreibung desselben Typs.
Das obige ist der detaillierte Inhalt vonWie kann ich in C# genau bestimmen, ob ein Typ ein Subtyp eines anderen ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!