Я знаю 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
)
Depends, используйте, 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.