Je connais iset aspour instanceof, mais qu'en est-il de la méthode réflexive isInstance () ?
Je connais iset aspour instanceof, mais qu'en est-il de la méthode réflexive isInstance () ?
Réponses:
L'équivalent de Java obj.getClass().isInstance(otherObj)en C # est le suivant:
bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());
Notez que tandis que Java et C # fonctionnent tous les deux sur l'objet de type d'exécution (Java java.lang.Class≣ C # System.Type) d'un obj(via .getClass()vs .getType()), Java isInstanceprend un objet comme argument, tandis que C # IsAssignableFromattend un autre System.Typeobjet.
isrequis un nom de type, en revanche. C'est ce que voulait OP: l'équivalent de Java isInstance. L'autre réponse est tout simplement fausse malgré le nombre ridicule de votes positifs.
bool result = (obj is MyClass); // Better than using 'as'
new Child() is Parent)
Cela dépend, à utiliser issi vous ne souhaitez pas utiliser le résultat de la distribution et à utiliser assi vous le faites. Vous ne voulez presque jamais écrire:
if(foo is Bar) {
return (Bar)foo;
}
Au lieu de:
var bar = foo as Bar;
if(bar != null) {
return bar;
}
juste du haut de ma tête, vous pouvez aussi faire:
bool result = ((obj as MyClass) != null)
Je ne sais pas ce qui fonctionnerait le mieux. Je laisserai à quelqu'un d'autre le soin de faire un benchmark :)
Le code ci-dessous peut être une alternative à IsAssignableFrom.
parentObject.GetType().IsInstanceOfType(inheritedObject)
Consultez la description de Type.IsInstanceOfType dans MSDN.