【发布时间】:2017-08-19 17:19:09
【问题描述】:
快速问题:如何在 C# 中将 Type 类型(不是双关语)与另一种类型进行比较?
我的意思是,我有一个Type typeField,我想知道它是否是System.String、System.DateTime 等,但typeField.Equals(System.String) 不起作用。
有什么线索吗?
【问题讨论】:
快速问题:如何在 C# 中将 Type 类型(不是双关语)与另一种类型进行比较?
我的意思是,我有一个Type typeField,我想知道它是否是System.String、System.DateTime 等,但typeField.Equals(System.String) 不起作用。
有什么线索吗?
【问题讨论】:
试试下面的
typeField == typeof(string)
typeField == typeof(DateTime)
C# 中的typeof 运算符将为您提供指定类型的Type 对象。 Type 实例与 == 运算符相当,因此这是比较它们的好方法。
注意:如果我没记错的话,在某些情况下,当涉及的类型是嵌入到程序集中的 COM 接口(通过 NoPIA)时,这种情况会发生故障。听起来好像不是这里的情况。
【讨论】:
ToString() 结果。
您可以使用 is operator。然后您可以通过以下方式检查对象是否为特定类型:
if (myObject is string)
{
DoSomething()
}
【讨论】:
is 关键字和 typeof 似乎表现不同,例如,我有一个从 BaseClass 派生的 BaseClass 和 DerivedClass。如果我声明一个名为var testClass = new DerivedClass(); 的变量,那么我比较像if (testClass is BaseClass),结果将是true,但如果我像if (testClass.GetType() == typeof(BaseClass)) 比较结果将是false。总之,如果需要显式比较派生类,请使用typeof
您可以使用以下方法比较完全相同的类型:
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
}
【讨论】:
如果您的实例是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 只转换一次到指定的类型。
【讨论】:
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
【讨论】: