Je connais is
et as
pour instanceof
, mais qu'en est-il de la méthode réflexive isInstance () ?
Je connais is
et as
pour 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 isInstance
prend un objet comme argument, tandis que C # IsAssignableFrom
attend un autre System.Type
objet.
is
requis 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 is
si vous ne souhaitez pas utiliser le résultat de la distribution et à utiliser as
si 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.