47

我想检查一个对象是否不是特定类型。我知道如何检查某些东西是否属于特定类型:

if (t is TypeA)
{
   ...
}

if (t isnt TypeA)
{
   ...
}   

不起作用。

4

7 回答 7

84

2020 年 10 月 30 日更新:

时代在变。从 C# 9.0 开始,您可以使用更自然的方式来检查它:

if(t is not TypeA) { ... }

原始答案:

C# 不是很自然的语言;)使用这个

if(!(t is TypeA))
{
   ...
}
于 2012-05-11T10:33:53.547 回答
10

如果您不仅要检查,还可以使用as运算符。

var a = t as TypeA;
if(a!= null)
   //use a.. 

这样,如果要在检查后使用类型,就可以避免双重转换..

于 2012-05-11T10:36:57.657 回答
4

如果你TypeA x = (TypeA)t;在 if 块里面做一个更好的方法是

TypeA x = t as TypeA
if(x != null)
{
...
}

这只会导致一次类型检查,而不是两次。

于 2012-05-11T10:38:37.580 回答
4

救援的扩展方法!!

public static class ObjectExtensions
{
    public static bool Isnt(this object source, Type targetType)
    {
        return source.GetType() != targetType;
    }
}

用法

if (t.Isnt(typeof(TypeA)))
{
   ...
}
于 2014-12-18T15:31:24.247 回答
4

简短回答:您可能想使用:

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).

于 2018-08-11T22:39:40.893 回答
2

我通常将 null 和类型检查全部放在一行中:

if (t == null || !(t is TypeA)) {
  ...
}

如果 TypeA 是一个结构,您需要再次稍微不同地处理它:

if (t == null || t.GetType() != typeof(TypeA)) {
  ...
}
于 2012-05-11T10:59:04.467 回答
0

检查以下示例getType()

object obj = new object();
obj.GetType();

string s;
s.GetType();

List<string> StringList = new List<string>();
StringList.GetType();
于 2014-02-27T08:26:25.670 回答