Я знаю 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.