Я знаю isі asдля instanceof, але як щодо відбивного методу isInstance () ?
Я знаю isі asдля instanceof, але як щодо відбивного методу isInstance () ?
Відповіді:
Еквівалент Java obj.getClass().isInstance(otherObj)в C # такий:
bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());
Зауважте, що в той час як і Java, і C # працюють над об'єктом типу виконання (Java java.lang.Class# C # System.Type) obj(через .getClass()vs .getType()), Java isInstanceприймає об'єкт як свій аргумент, тоді як C # IsAssignableFromочікує інший System.Typeоб'єкт.
isпотрібна назва типу, навпаки. Ось чого хотів OP: еквівалент Java isInstance. Інша відповідь просто неправильна, незважаючи на смішну кількість голосів.
bool result = (obj is MyClass); // Better than using 'as'
new Child() is Parent)
Залежить, використовуйте, isякщо ви не хочете використовувати результат акторського складу, і використовуйте, asякщо хочете. Навряд чи ти коли-небудь захочеш написати:
if(foo is Bar) {
return (Bar)foo;
}
Замість:
var bar = foo as Bar;
if(bar != null) {
return bar;
}
просто від маківки, ви також можете зробити:
bool result = ((obj as MyClass) != null)
Не впевнений, який би працював краще. Я залишу це для когось іншого для порівняння :)
Нижче код може бути альтернативою IsAssignableFrom.
parentObject.GetType().IsInstanceOfType(inheritedObject)
Див. Опис Type.IsInstanceOfType у MSDN.