Как сравнивать типы
Быстрый вопрос: как сравнить тип типа (каламбур не предназначен) с другим типом в С#?
Я имею в виду 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
}
Ответ 4
http://msdn.microsoft.com/en-us/library/system.type.gettype.aspx
Console.WriteLine("typeField is a {0}", typeField.GetType());
который даст вам что-то вроде
typeField is a String
typeField is a DateTime
или
http://msdn.microsoft.com/en-us/library/58918ffs(v=vs.71).aspx
Ответ 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
только один раз в указанный тип.