【问题标题】:How to check if an object is not of a particular type?如何检查对象是否不是特定类型?
【发布时间】:2012-05-11 10:32:57
【问题描述】:

我想检查一个对象是否不是特定类型。我知道如何检查某物是否为特定类型的

if (t is TypeA)
{
   ...
}

但是

if (t isnt TypeA)
{
   ...
}   

不起作用。

【问题讨论】:

标签: c# c#-4.0


【解决方案1】:

2020 年 10 月 30 日更新:

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

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

原始答案:

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

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

【讨论】:

    【解决方案2】:

    如果你不仅要检查,你可以使用as操作符。

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

    这样,如果你想在检查后使用一个类型,你就避免了双重转换..

    【讨论】:

    • 如果 a 在演员阵容之前为空,我认为这不起作用。
    【解决方案3】:

    如果您在 if 块内执行 TypeA x = (TypeA)t;,那么更好的方法是

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

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

    【讨论】:

      【解决方案4】:

      救援的扩展方法!!

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

      用法

      if (t.Isnt(typeof(TypeA)))
      {
         ...
      }
      

      【讨论】:

      • 我这样做了,但我也创建了“IS”的扩展名,只是为了让代码看起来很相似——例如t.IsA(xxx) ,t.IsNotA(xxx)。是的,我知道这不是必需的,但对我来说看起来更好。
      【解决方案5】:

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

      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)

      【讨论】:

        【解决方案6】:

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

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

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

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

        【讨论】:

          【解决方案7】:

          查看下面的getType() 示例:

          object obj = new object();
          obj.GetType();
          
          string s;
          s.GetType();
          
          List<string> StringList = new List<string>();
          StringList.GetType();
          

          【讨论】:

          • 仅链接的答案在这里效率不高。请使用相关代码编辑您的答案,以便每个人都能更轻松地阅读对主题重要的内容。
          猜你喜欢
          • 2010-09-23
          • 1970-01-01
          • 2015-08-03
          • 1970-01-01
          • 2012-10-09
          • 1970-01-01
          • 2011-11-05
          • 2017-10-28
          相关资源
          最近更新 更多