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

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

Любая подсказка?

Ответ 1

Попробуйте выполнить

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

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

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

Ответ 2

Вы можете использовать для него оператор is . Затем вы можете проверить, является ли объект конкретным типом, написав:

if (myObject is string)
{
  DoSomething()
}

Ответ 3

Для одного и того же типа можно сравнить:

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
}

Ответ 5

Если ваш экземпляр 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 только один раз в указанный тип.