Что в C # эквивалентно Java isInstance ()?

Ответы:

52

Эквивалент 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объект.

Конрад Рудольф
источник
1
Примечание. IsAssignableFrom принимает тип, а не объект, поэтому вам действительно нужно выполнить OtherObj.getType ().
FlySwat
3
Спасибо, Джон - и помни, это вики! Я не обижаюсь на людей, исправляющих мои ошибки.
Конрад Рудольф
1
интересно ... в java JVM обрабатывает "instanceof" специально, по-видимому, это очень и очень быстро, что может объяснить, почему это необычное ключевое слово (в java также есть метод isAssignable).
Майкл Нил
Чем этот метод лучше, чем более читаемый оператор "is"?
Тимоти Гонсалес
@TimothyGonzalez Потому что он делает что-то другое. Он проверяет, имеют ли две переменные одного и того же типа. isдля сравнения требуется имя типа. Это то, что хотел OP: эквивалент Java isInstance. Другой ответ просто неверен, несмотря на смехотворное количество голосов.
Конрад Рудольф
181
bool result = (obj is MyClass); // Better than using 'as'
Ана Беттс
источник
1
Работает ли это даже для классов, использующих наследование? ( new Child() is Parent)
Томаш Зато - Reinstate Monica
1
протестирован здесь, он работает для классов, которые наследуются пользователем. Спасибо чувак.
Гильерме Гольфетто
39

Depends, используйте, isесли не хотите использовать результат приведения, и используйте, asесли хотите. Вы вряд ли когда-нибудь захотите написать:

if(foo is Bar) {
    return (Bar)foo;
}

Вместо того:

var bar = foo as Bar;
if(bar != null) {
    return bar;
}
Роберт Гоуленд
источник
2

просто вне моей головы, вы также можете сделать:

bool result = ((obj as MyClass) != null)

Не уверен, что будет лучше. Я оставлю это кому-то другому для тестирования :)

CodingWithSpike
источник
2

Код ниже может быть альтернативой IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject)

См. Описание Type.IsInstanceOfType в MSDN.

Ёнджэ
источник