Conosco ise asper instanceof, ma per quanto riguarda il metodo isInstance () riflessivo ?
Conosco ise asper 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 isInstanceaccetta un oggetto come argomento, mentre C # si IsAssignableFromaspetta un altro System.Typeoggetto.
isrichiesto 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 isse non vuoi usare il risultato del cast e usa asse 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.