Ich habe die Notwendigkeit, ein paar Kontrollen wie dies zu tun:Wie überprüft man, ob die Klasse "ist" eine Instanz eines Typs, der als Variable in C# angegeben ist?
if(thisInstance is ThatClass || thisInstance is ThatOtherClass)
Ich will eigentlich nicht viel davon zu tun, mehr brauchen, so konnte ich es einfach schreiben, wie es oben ist, aber ich würde bevorzugen Sie es immer noch auf eine sauberere Weise, z. wie folgt:
Type[] arrayOfClasses = new Type[] { typeof(ThatClass), typeof(ThatOtherClass))}
if(isOfAnyType(thisInstance, arrayOfClasses))
Aber aus irgendeinem Grund kann ich es nicht zur Arbeit bekommen. Aus irgendeinem Grund, obwohl die Zeichenfolge Darstellungen von
thisInstance.GetType()
und
typeof(ThatClass)
wäre das gleiche,
thisInstance.GetType().IsInstanceOfType(type)
wird noch immer in falschen führen.
Falls es einen Unterschied macht, ist dies ein Unity-Projekt. Wenn Sie also einen weiteren GetType() für die vergleichbaren Elemente (zB thisInstance.GetType(). GetType()) aufrufen, ist das Ergebnis immer System.MonoType, In diesem Fall gibt IsInstanceOfType immer "true" zurück, was natürlich auch nicht nützlich ist.
Irgendwelche Ideen, warum der Vergleich fehlschlägt oder wie es funktioniert? Oder sollte ich einfach aufgeben und einfach "thisInstance is ThatClass" verwenden, wo immer es nötig ist?
Ich würde nicht Ihren ursprünglichen Code in irgendeiner Weise "unordentlich" sein. Es scheint sehr einfach zu sein. Warum Reflexion verwenden, wenn Sie einen Operator der Sprache verwenden können? Die bessere Frage wäre: "Kann ich meinen Code umstrukturieren, so dass die Überprüfung" "unnötig ist?" –
Nun, mit nur diesen beiden Klassen ist es nicht besonders unordentlich, aber es ist weniger einfach konfigurierbar, und mit mehr Klassen würde es aus meiner Sicht ein bisschen unordentlich erscheinen. – Jeffed
Sicher, aber dann ist die Frage: Warum haben Sie ein Programm, wo Sie eine Menge Laufzeitüberprüfungen des Typs einer Sache machen müssen? Anstatt zu versuchen, irgendeinen uneleganten Code, der aus den Laufzeitüberprüfungen resultiert, zu überarbeiten, versuchen Sie stattdessen, sie vollständig zu eliminieren. –