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.


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


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

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


2

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

parentObject.GetType().IsInstanceOfType(inheritedObject)

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.