【发布时间】:2012-05-11 10:32:57
【问题描述】:
我想检查一个对象是否不是特定类型。我知道如何检查某物是否为特定类型的:
if (t is TypeA)
{
...
}
但是
if (t isnt TypeA)
{
...
}
不起作用。
【问题讨论】:
我想检查一个对象是否不是特定类型。我知道如何检查某物是否为特定类型的:
if (t is TypeA)
{
...
}
但是
if (t isnt TypeA)
{
...
}
不起作用。
【问题讨论】:
2020 年 10 月 30 日更新:
时代在变。从 C# 9.0 开始,您可以使用更自然的方式来检查它:
if(t is not TypeA) { ... }
原始答案:
C# 不是很自然的语言 ;) 使用这个
if(!(t is TypeA))
{
...
}
【讨论】:
【讨论】:
如果您在 if 块内执行 TypeA x = (TypeA)t;,那么更好的方法是
TypeA x = t as TypeA
if(x != null)
{
...
}
这只会导致一次类型检查,而不是两次。
【讨论】:
救援的扩展方法!!
public static class ObjectExtensions
{
public static bool Isnt(this object source, Type targetType)
{
return source.GetType() != targetType;
}
}
用法
if (t.Isnt(typeof(TypeA)))
{
...
}
【讨论】:
简短回答:您可能想使用:
if (t.GetType()==typeof(TypeA))
{
...
}
if (t.GetType()!=typeof(TypeA))
{
...
}
长答案:
所以。请注意,您是在询问它是否是特定类型。 is 不会告诉您它是否是特定类型 - 它会告诉您它是否是特定类型或 该类型的任何后代。
所以如果你有两个类,Animal 和 Cat:Animal,而 felix 是一只猫,那么
if (felix is Animal)
{
//returns true
}
if (felix.GetType() == typeof(Animal))
{
//does not
}
如果它对你来说不重要,继承类是可以的,那么不要担心,使用!(felix is Animal) 就像其他人提到的那样,你很好! (你可能没事。)
但如果您需要确定 felix 是一个特定的动物,那么您需要询问t.GetType()==typeof(TypeA)。
【讨论】:
我通常将 null 和类型检查全部放在一行中:
if (t == null || !(t is TypeA)) {
...
}
如果 TypeA 是一个结构,您需要再次稍微不同地处理它:
if (t == null || t.GetType() != typeof(TypeA)) {
...
}
【讨论】:
查看下面的getType() 示例:
object obj = new object();
obj.GetType();
string s;
s.GetType();
List<string> StringList = new List<string>();
StringList.GetType();
【讨论】: