Ich weiß von is
und as
für instanceof
, aber was ist mit der reflektierenden isInstance () -Methode?
Ich weiß von is
und as
für instanceof
, aber was ist mit der reflektierenden isInstance () -Methode?
Antworten:
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 isInstance
ein Objekt als Argument verwendet, während C # ein IsAssignableFrom
anderes System.Type
Objekt erwartet .
is
benö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.
bool result = (obj is MyClass); // Better than using 'as'
new Child() is Parent
)
Abhängig davon, verwenden is
Sie , wenn Sie das Ergebnis der Besetzung nicht verwenden möchten, und verwenden as
Sie, 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;
}
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 :)
Der folgende Code kann eine Alternative zu sein IsAssignableFrom
.
parentObject.GetType().IsInstanceOfType(inheritedObject)
Siehe Beschreibung von Type.IsInstanceOfType in MSDN.