Eu sei de is
e as
para instanceof
, mas e o método reflexivo isInstance () ?
Eu sei de is
e as
para instanceof
, mas e o método reflexivo isInstance () ?
Respostas:
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 isInstance
leva um objeto como seu argumento, enquanto o C # IsAssignableFrom
espera outro System.Type
objeto.
is
exigia 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.
bool result = (obj is MyClass); // Better than using 'as'
new Child() is Parent
)
Depende, use is
se não quiser usar o resultado do gesso e use as
se 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;
}
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 :)
O código abaixo pode ser uma alternativa para IsAssignableFrom
.
parentObject.GetType().IsInstanceOfType(inheritedObject)
Consulte a descrição de Type.IsInstanceOfType no MSDN.