Как сравнивать типы


130

Быстрый вопрос: как сравнить тип Type (каламбур не предназначен) с другим типом в C #? Я имею в виду, У меня есть , Type typeFieldи я хочу знать , если это System.String, System.DateTimeи т.д., но typeField.Equals(System.String)не работает.

Есть подсказка?

Ответы:


180

Попробуйте следующее

typeField == typeof(string)
typeField == typeof(DateTime)

typeofОператор в C # даст вам Typeобъект для указанного типа. Typeэкземпляры сопоставимы с ==оператором, поэтому это хороший метод их сравнения.

Примечание. Если я правильно помню, в некоторых случаях это выходит из строя, когда задействованные типы являются интерфейсами COM, которые встроены в сборки (через NoPIA). Не похоже, что здесь дело обстоит именно так.



32

Вы можете сравнить точно такой же тип, используя:

class A {
}
var a = new A();
var typeOfa = a.GetType();
if (typeOfa == typeof(A)) {
}

typeof возвращает объект Type из заданного класса.

Но если у вас есть тип B, унаследованный от A, тогда это сравнение неверно. И вы ищете IsAssignableFrom .

class B : A {
}
var b = new B();
var typeOfb = b.GetType();

if (typeOfb == typeof(A)) { // false
}

if (typeof(A).IsAssignableFrom(typeOfb)) { // true
}

7

Если ваш экземпляр Type:

Type typeFiled;
if (typeField == typeof(string))
{ 
    ... 
}

но если ваш экземпляр является objectи не Typeиспользовать asоператор:

object value;
string text = value as string;
if (text != null)
{
    // value is a string and you can do your work here
}

это имеет то преимущество, что можно преобразовать valueтолько один раз в указанный тип.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.