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