Qual é o C # equivalente a isInstance () do Java?

Respostas:

51

O equivalente do Java obj.getClass().isInstance(otherObj)em C # é o seguinte:

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

Observe que, embora Java e C # funcionem no objeto do tipo runtime (Java java.lang.Class≣ C # System.Type) de um obj(via .getClass()vs .getType()), o Java isInstanceleva um objeto como seu argumento, enquanto o C # IsAssignableFromespera outro System.Typeobjeto.

Konrad Rudolph
fonte
1
Observação IsAssignableFrom leva um Type, não um objeto, então você precisa realmente fazer OtherObj.getType ().
FlySwat
3
Obrigado Jon - e lembre-se, este é um wiki! Não me ressinto que as pessoas corrijam meus erros.
Konrad Rudolph
1
interessante ... em java, a JVM trata "instanceof" especialmente, aparentemente é muito muito rápido, o que pode explicar por que é incomum uma palavra-chave (também há um método isAssignable em java).
Michael Neale
Por que esse método é melhor do que o operador "é", que é mais legível?
Timothy Gonzalez
@TimothyGonzalez Porque faz algo diferente. Ele testa se duas variáveis têm o mesmo tipo. isexigia um nome de tipo, em contraste. Isso é o que o OP queria: o equivalente do Java isInstance. A outra resposta está simplesmente errada, apesar do número ridículo de votos positivos.
Konrad Rudolph de
181
bool result = (obj is MyClass); // Better than using 'as'
Ana betts
fonte
1
Isso funciona mesmo para classes que usam herança? ( new Child() is Parent)
Tomáš Zato - Reintegração de Monica em
1
testado aqui, ele funciona para classes com herança de usuário. Obrigado cara.
Guilherme Golfetto
39

Depende, use isse não quiser usar o resultado do gesso e use asse quiser. Você dificilmente quer escrever:

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

Ao invés de:

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

logo de cara, você também pode fazer:

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

Não tenho certeza de qual teria melhor desempenho. Vou deixar para outra pessoa fazer o benchmark :)

CodingWithSpike
fonte
2

O código abaixo pode ser uma alternativa para IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject)

Consulte a descrição de Type.IsInstanceOfType no MSDN.

Youngjae
fonte