¿Cuál es el equivalente de C # a isInstance () de Java?

Respuestas:

52

El equivalente de Java obj.getClass().isInstance(otherObj)en C # es el siguiente:

bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());

Tenga en cuenta que mientras tanto Java como C # funcionan en el objeto de tipo de tiempo de ejecución (Java java.lang.Class≣ C # System.Type) de un obj(via .getClass()vs .getType()), Java isInstancetoma un objeto como argumento, mientras que C # IsAssignableFromespera otro System.Typeobjeto.

Konrad Rudolph
fuente
1
Tenga en cuenta que IsAssignableFrom toma un tipo, no un objeto, por lo que debe hacer OtherObj.getType ().
FlySwat
3
Gracias Jon, y recuerda, ¡esto es un wiki! No me molesta que la gente corrija mis errores.
Konrad Rudolph
1
interesante ... en Java, la JVM trata a "instanceof" especialmente, aparentemente es muy, muy rápido, lo que puede explicar por qué es inusualmente una palabra clave (también hay un método isAssignable en Java).
Michael Neale
¿Por qué este método es mejor que el operador "es", que es más legible?
Timothy Gonzalez
@TimothyGonzalez Porque hace algo diferente. Prueba si dos variables tienen el mismo tipo. isrequirió un nombre de tipo, por el contrario. Esto es lo que OP quería: el equivalente de Java isInstance. La otra respuesta es simplemente incorrecta a pesar del ridículo número de votos a favor.
Konrad Rudolph
181
bool result = (obj is MyClass); // Better than using 'as'
Ana Betts
fuente
1
¿Funciona incluso para las clases que usan herencia? ( new Child() is Parent)
Tomáš Zato - Reincorpora a Monica
1
probado aquí, funciona para las clases que heredan el usuario. Gracias hombre.
Guilherme Golfetto
39

Depende, utilícelo issi no desea usar el resultado del yeso y úselo assi lo desea. Casi nunca quieres escribir:

if(foo is Bar) {
    return (Bar)foo;
}

En vez de:

var bar = foo as Bar;
if(bar != null) {
    return bar;
}
Robert Gowland
fuente
2

justo fuera de mi cabeza, también podrías hacer:

bool result = ((obj as MyClass) != null)

No estoy seguro de cuál funcionaría mejor. Lo dejaré en manos de otra persona para comparar :)

Codificación con espiga
fuente
2

El siguiente código puede ser una alternativa a IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject)

Consulte la descripción de Type.IsInstanceOfType en MSDN.

Youngjae
fuente