User u = new User();
Type t = typeof(User);
u is User -> returns true
u is t -> compilation error
Як я можу перевірити, чи є якась змінна якогось типу таким чином?
Відповіді:
Всі інші відповіді містять суттєві упущення.
isОператор не НЕ перевірити , якщо тип часу виконання операнда саме цей тип; швидше, він перевіряє, чи сумісний тип виконання з даним типом:
class Animal {}
class Tiger : Animal {}
...
object x = new Tiger();
bool b1 = x is Tiger; // true
bool b2 = x is Animal; // true also! Every tiger is an animal.
Але перевірка ідентичності типу за допомогою відображення перевіряє ідентичність , а не сумісність
bool b5 = x.GetType() == typeof(Tiger); // true
bool b6 = x.GetType() == typeof(Animal); // false! even though x is an animal
or with the type variable
bool b7 = t == typeof(Tiger); // true
bool b8 = t == typeof(Animal); // false! even though x is an
Якщо це не те, що ви хочете, то ви, ймовірно, хочете IsAssignableFrom:
bool b9 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true
bool b10 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger.
or with the type variable
bool b11 = t.IsAssignableFrom(x.GetType()); // true
bool b12 = t.IsAssignableFrom(x.GetType()); // true! A
tна typeof(Animal). Тож вдосконалена форма Марка стає t.IsInstanceOfType(x).
GetType()існує для кожного окремого типу фреймворка, оскільки він визначений для базового objectтипу. Отже, незалежно від самого типу, ви можете використовувати його для повернення основногоType
Отже, все, що вам потрібно зробити, це:
u.GetType() == t
Вам потрібно перевірити, чи Тип вашого екземпляра дорівнює типу класу. Щоб отримати тип екземпляра, ви використовуєте GetType()метод:
u.GetType().Equals(t);
або
u.GetType.Equals(typeof(User));
повинен це зробити. Очевидно, ви можете використовувати '==' для порівняння, якщо хочете.
u.GetType.Equals(typeof(User));
tяка містить тип.
Для того, щоб перевірити, чи об'єкт сумісний із даною змінною типу, замість того, щоб писати
u is t
вам слід писати
typeof(t).IsInstanceOfType(u)
typeof(Animal).IsInstanceOfType(x)коротше і простіше, ніжtypeof(Animal).IsAssignableFrom(x.GetType());(і Resharper запропонує використовувати перше, якщо ви використовуєте друге).