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.

Konrad Rudolph
la source
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
181
bool result = (obj is MyClass); // Better than using 'as'
Ana Betts
la source
1
Cela fonctionne-t-il même pour les classes qui utilisent l'héritage? ( new Child() is Parent)
Tomáš Zato - Réintégrer Monica
1
testé ici, il fonctionne pour les classes qui héritent de l'utilisateur. Merci mec.
Guilherme Golfetto
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;
}
Robert Gowland
la source
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 :)

Codage avec Spike
la source
2

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

parentObject.GetType().IsInstanceOfType(inheritedObject)

Consultez la description de Type.IsInstanceOfType dans MSDN.

Youngjae
la source