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 предложит использовать первое, если вы используете второе).