Wiem o isi asdla instanceof, ale co z refleksyjną metodą isInstance () ?
Wiem o isi asdla 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 isInstanceprzyjmuje obiekt jako swój argument, podczas gdy C # IsAssignableFromoczekuje innego System.Typeobiektu.
iswymagał 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, isjeśli nie chcesz używać wyniku rzutowania i użyj, asjeś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.