2008-11-11 7 views

Antwort

47

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

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

anzumerken, dass, während sowohl Java und C# Arbeit an den Laufzeittyp Objekt (Java java.lang.Class ≣ C# System.Type) eines obj (via .getClass() vs .getType()), isInstance von Java nimmt ein Objekt als sein Argument, während C# IsAssignableFrom ein anderes System.Type Objekt erwartet.

+1

Hinweis IsAssignableFrom benötigt einen Type, kein Objekt, daher müssen Sie OtherObj.getType() ausführen. – FlySwat

+3

Danke Jon - und denk dran, das ist ein Wiki! Ich ärgere mich nicht, dass Leute meine Fehler korrigieren. –

+1

interessant ... in Java behandelt die JVM "instanceof" speziell, anscheinend ist es sehr, sehr schnell, was erklären könnte, warum es ungewöhnlich ein Schlüsselwort ist (es gibt auch eine isAssignable-Methode in Java). –

2

direkt an der Spitze von meinem Kopf, können Sie auch tun:

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

Nicht sicher, was besser durchführen würde. Ich werde es an jemand anderen zu Benchmark überlassen :)

172
bool result = (obj is MyClass); // Better than using 'as' 
+0

Funktioniert es auch für Klassen, die Vererbung verwenden? ('neues Kind() ist übergeordnetes') –

+2

ja es tut, genau, wie Sie über –

+0

hier geprüft zeigen, funktioniert es für Klassen, die Benutzervererbung. Danke, Mann. –

36

Hängt, is verwenden, wenn Sie möchten, und as nicht das Ergebnis der Besetzung verwenden, wenn Sie tun. Sie wollen so gut wie nie schreiben:

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

Statt:

var bar = foo as Bar; 
if(bar != null) { 
    return bar; 
} 
3

Below-Code kann zu IsAssignableFrom Alternative sein.

parentObject.GetType().IsInstanceOfType(inheritedObject) 

Siehe Type.IsInstanceOfType Beschreibung in MSDN.