Quel est l'équivalent C # de isInstance () de Java?


Réponses:


52

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.


1
Remarque IsAssignableFrom prend un Type, pas un objet, vous devez donc réellement faire OtherObj.getType ().
FlySwat

3
Merci Jon - et souvenez-vous, c'est un wiki! Je ne veux pas que les gens corrigent mes erreurs.
Konrad Rudolph

1
intéressant ... en java, la JVM traite "instanceof" spécialement, apparemment c'est très très rapide, ce qui peut expliquer pourquoi c'est inhabituellement un mot-clé (il y a aussi une méthode isAssignable en java).
Michael Neale

Pourquoi cette méthode est-elle meilleure que l'opérateur "est" qui est plus lisible?
Timothy Gonzalez

@TimothyGonzalez Parce qu'il fait quelque chose de différent. Il teste si deux variables ont le même type. 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.
Konrad Rudolph


39

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;
}

2

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 :)


2

Le code ci-dessous peut être une alternative à IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject)

Consultez la description de Type.IsInstanceOfType dans MSDN.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.