Wiem o is
i as
dla instanceof
, ale co z refleksyjną metodą isInstance () ?
Wiem o is
i as
dla instanceof
, ale co z refleksyjną metodą isInstance () ?
Odpowiedzi:
Odpowiednik języka Java obj.getClass().isInstance(otherObj)
w C # jest następujący:
bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());
Zauważ, że podczas gdy zarówno Java, jak i C # działają na obiekcie typu runtime (Java java.lang.Class
≣ C # System.Type
) obj
(via .getClass()
vs .getType()
), Java isInstance
przyjmuje obiekt jako swój argument, podczas gdy C # IsAssignableFrom
oczekuje innego System.Type
obiektu.
is
wymagał natomiast nazwy typu. Właśnie tego chciał OP: odpowiednik Java isInstance
. Druga odpowiedź jest po prostu błędna, pomimo absurdalnej liczby głosów za.
bool result = (obj is MyClass); // Better than using 'as'
new Child() is Parent
)
Zależy, użyj, is
jeśli nie chcesz używać wyniku rzutowania i użyj, as
jeśli to zrobisz. Rzadko kiedy chcesz pisać:
if(foo is Bar) {
return (Bar)foo;
}
Zamiast:
var bar = foo as Bar;
if(bar != null) {
return bar;
}
tuż przy mojej głowie, możesz też zrobić:
bool result = ((obj as MyClass) != null)
Nie jestem pewien, który będzie działał lepiej. Zostawię to komuś innemu do analizy porównawczej :)
Poniższy kod może być alternatywą dla IsAssignableFrom
.
parentObject.GetType().IsInstanceOfType(inheritedObject)
Zobacz opis Type.IsInstanceOfType w witrynie MSDN.