Conosco is
e as
per instanceof
, ma per quanto riguarda il metodo isInstance () riflessivo ?
Conosco is
e as
per instanceof
, ma per quanto riguarda il metodo isInstance () riflessivo ?
Risposte:
L'equivalente di Java obj.getClass().isInstance(otherObj)
in C # è il seguente:
bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());
Si noti che mentre sia Java che C # funzionano sull'oggetto di tipo runtime (Java java.lang.Class
≣ C # System.Type
) di un obj
(tramite .getClass()
vs .getType()
), Java isInstance
accetta un oggetto come argomento, mentre C # si IsAssignableFrom
aspetta un altro System.Type
oggetto.
is
richiesto un nome di tipo, al contrario. Questo è ciò che voleva OP: l'equivalente di Java isInstance
. L'altra risposta è semplicemente sbagliata nonostante il numero ridicolo di voti positivi.
bool result = (obj is MyClass); // Better than using 'as'
new Child() is Parent
)
Dipende, usa is
se non vuoi usare il risultato del cast e usa as
se lo fai. Quasi mai vorresti scrivere:
if(foo is Bar) {
return (Bar)foo;
}
Invece di:
var bar = foo as Bar;
if(bar != null) {
return bar;
}
appena sopra la mia testa, potresti anche fare:
bool result = ((obj as MyClass) != null)
Non sono sicuro di quale funzionerebbe meglio. Lascio a qualcun altro il benchmark :)
Il codice sottostante può essere alternativo a IsAssignableFrom
.
parentObject.GetType().IsInstanceOfType(inheritedObject)
Vedere la descrizione di Type.IsInstanceOfType in MSDN.