Вопрос по types, c# – Как проверить, соответствует ли тип переменной типу, хранящемуся в переменной

80
User u = new User();
Type t = typeof(User);

u is User -> returns true

u is t -> compilation error

Как я могу проверить, если какая-то переменная имеет некоторый тип таким образом?

Ваш Ответ

4   ответа
4

Чтобы проверить, совместим ли объект с заданной переменной типа, вместо записи

u is t

ты должен написать

typeof(t).IsInstanceOfType(u)
@KyleHumfeld Если у вас был тип foo; Объект А; Вы не можете написать "A is foo", но вы можете написать foo.isInstanceOfType (A)
В чем преимущество более подробного синтаксиса по сравнению с «u is t»? синтаксис?
9

равен ли тип вашего экземпляра типу класса. Чтобы получить тип экземпляра вы используетеGetType() метод:

 u.GetType().Equals(t);

или же

 u.GetType.Equals(typeof(User));

должен сделать это. Очевидно, что вы можете использовать & apos; == & apos; сделать ваше сравнение, если вы предпочитаете.

Одна из причин, по которой это менее безопасно, чем использование ==, состоит в том, что если GetType () каким-либо образом возвращает ноль - он будет выбрасывать.
@Fuex, да, я думаю, что это делает код более легким для чтения, если typeof является встроенным, именно поэтому я разместил его таким образом, хотя в примере с OP у него уже есть переменнаяt который содержит тип.
+1 Но предпочитаю второй вариант.u.GetType.Equals(typeof(User));
@DaveBish, если GetType вернул значение NULL, тогда я буду обеспокоен тем, что множество вещей начнёт выбрасывать ... но, если принять во внимание, вы, конечно, правы
@SamHolder Да - единственная ситуация, которая могла бы произойти, была бы, если бы кто-то переопределил базовый тип и как-то испортил реализацию. Это было бы странно, конечно.
12

GetType() существует на каждом типе фреймворка, потому что он определен на основеobject тип. Таким образом, независимо от самого типа, вы можете использовать его для возврата основногоType

Итак, все, что вам нужно сделать, это:

u.GetType() == t
@ Даниэль - Не совсем. Ответ Дэйва верен, только если вы хотитеexclude подклассы т. Ответ Эрика в основном объясняет, что делать; просто отсутствует пояснение того, куда ставить «t». Я добавлю туда комментарий.
Ответ Эрика ниже намного лучше - пожалуйста, прочитайте.
На самом деле ответ Эрика полезен и все, но он не отвечает на реальный вопрос о том, как тестировать с неизвестным типом в & quot; u is t & quot; манера, описанная в оригинальном вопросе, и ваша.
175

is оператор делаетnot проверьте, является ли тип времени выполнения операндаexactly данный тип; скорее, он проверяет, является ли тип среды выполненияis compatible with данный тип:

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.

Но проверка на типidentity с проверками отражения дляidentity, не дляcompatibility

bool b3 = x.GetType() == typeof(Tiger); // true
bool b4 = x.GetType() == typeof(Animal); // false! even though x is an animal

Если это не то, что вы хотите, то вы, вероятно, хотите IsAssignableFrom:

bool b5 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true
bool b6 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger.
Хотя последний подход, показанный здесь, работает, он излишне многословен.typeof(Animal).IsInstanceOfType(x) короче и прямолинейнееtypeof(Animal).IsAssignableFrom(x.GetType()); (и Решарпер предложит использовать первое, если вы используете второе).
Уточнение: чтобы ответить на оригинальный вопрос, заменитьt заtypeof(Animal), Таким образом, улучшенная форма Марка становитсяt.IsInstanceOfType(x).

Похожие вопросы