Was ist das C # -Äquivalent zu Javas isInstance ()?

Antworten:

51

Das Äquivalent von Java obj.getClass().isInstance(otherObj)in C # lautet wie folgt:

bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());

Beachten Sie, dass Java und C # zwar am Laufzeitobjekt (Java java.lang.Class≣ C # System.Type) eines obj(via .getClass()vs .getType()) arbeiten, Java jedoch isInstanceein Objekt als Argument verwendet, während C # ein IsAssignableFromanderes System.TypeObjekt erwartet .

Konrad Rudolph
quelle
1
Hinweis IsAssignableFrom verwendet einen Typ und kein Objekt. Sie müssen also OtherObj.getType () ausführen.
FlySwat
3
Danke Jon - und denk dran, das ist ein Wiki! Ich ärgere mich nicht darüber, dass Leute meine Fehler korrigieren.
Konrad Rudolph
1
interessant ... in Java behandelt die JVM "instanceof" speziell, anscheinend ist es sehr, sehr schnell, was erklären kann, warum es ungewöhnlich ein Schlüsselwort ist (es gibt auch eine isAssignable-Methode in Java).
Michael Neale
Warum ist diese Methode besser als der besser lesbare Operator "is"?
Timothy Gonzalez
@ TimothyGonzalez Weil es etwas anderes macht. Es wird geprüft, ob zwei Variablen denselben Typ haben. isbenötigte dagegen einen Typnamen. Dies ist, was OP wollte: das Äquivalent von Java isInstance. Die andere Antwort ist trotz der lächerlichen Anzahl von Upvotes einfach falsch.
Konrad Rudolph
181
bool result = (obj is MyClass); // Better than using 'as'
Ana Betts
quelle
1
Funktioniert es auch für Klassen, die Vererbung verwenden? ( new Child() is Parent)
Tomáš Zato - Wiedereinsetzung Monica
1
Hier getestet, funktioniert es für Klassen, die Benutzer vererben. Danke, Mann.
Guilherme Golfetto
39

Abhängig davon, verwenden isSie , wenn Sie das Ergebnis der Besetzung nicht verwenden möchten, und verwenden asSie, wenn Sie dies tun. Sie wollen kaum jemals schreiben:

if(foo is Bar) {
    return (Bar)foo;
}

Anstatt:

var bar = foo as Bar;
if(bar != null) {
    return bar;
}
Robert Gowland
quelle
2

Sie können auch Folgendes tun:

bool result = ((obj as MyClass) != null)

Ich bin mir nicht sicher, welche besser abschneiden würde. Ich überlasse es jemand anderem zum Benchmarking :)

CodingWithSpike
quelle
2

Der folgende Code kann eine Alternative zu sein IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject)

Siehe Beschreibung von Type.IsInstanceOfType in MSDN.

Youngjae
quelle