2011-03-30 121 views
92

快速问题:如何比较类型类型(双关语不打算)与C#中的另一种类型? 我的意思是,我有一个Type typeField,我想知道它是否是System.String,System.DateTime等,但typeField.Equals(System.String)不起作用。如何比较类型

任何线索?

回答

135

请尝试以下

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

C#中的typeof运算符将为您提供指定类型的Type对象。 Type实例与==运算符相当,因此这是比较它们的好方法。

注意:如果我没有记错,当涉及的类型是嵌入程序集的COM接口(通过NoPIA)时,会出现这种情况。听起来不像这里是这种情况。

+0

感谢您的帮助! :) – Archedius 2011-03-30 07:27:24

25

您可以比较准确地为使用相同类型:

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

的typeof返回从给定类类型的对象。

但是,如果您有一个类型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 
} 
53

您可以使用它isoperator。然后,您可以检查,如果对象是通过编写特定类型:

if (myObject is string) 
{ 
    DoSomething() 
} 
+1

对我们来说“is”还是“typeof”更好? – 2015-01-12 18:10:59

+6

但是这个是针对对象实例的吗?不是'Type' ... – 5argon 2015-03-26 18:40:30

+1

是的,它是例如一种类型 – 2015-03-30 12:54:35

2

如果您的实例是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只转换成指定的类型。