How to check if an object is not of a particular type?

前端 未结 7 1463
名媛妹妹
名媛妹妹 2021-01-03 19:38

I want to check if an object is not of a particular type. I know how to check if something is of a particular type:

if (t is TypeA)
{
   ...
}


        
相关标签:
7条回答
  • 2021-01-03 19:46

    If you are doing a TypeA x = (TypeA)t; inside the if block then a better way is

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

    This causes only one time type checking rather than twice.

    0 讨论(0)
  • 2021-01-03 19:49

    I usually stick the null and type checking all in one line:

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

    If TypeA is a struct, you'll need to handle it slightly differently again:

    if (t == null || t.GetType() != typeof(TypeA)) {
      ...
    }
    
    0 讨论(0)
  • 2021-01-03 19:55

    UPDATE 2020-10-30:

    Times are changing. Starting from C# 9.0 you can use more natural way of checking it:

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

    ORIGINAL ANSWER:

    C# is not quite natural language ;) Use this one

    if(!(t is TypeA))
    {
       ...
    }
    
    0 讨论(0)
  • 2021-01-03 19:56

    Short answer: you may want to use:

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

    Long answer:

    So. Be aware that you're asking if it's a particular type. is doesn't tell you if it's a particular type - it tells you if it's a particular type or any descendant of that type.

    So if you have two classes, Animal, and Cat : Animal, and felix is a cat, then

    if (felix is Animal)
    {
        //returns true
    }
    if (felix.GetType() == typeof(Animal))
    {
        //does not
    }
    

    If it's not important to you, inherited classes are okay, then don't worry about it, use !(felix is Animal) as others mentioned, and you're fine! (You're probably fine.)

    But if you need to be sure felix is specifically an Animal, then you need to ask if t.GetType()==typeof(TypeA).

    0 讨论(0)
  • 2021-01-03 20:01

    Extensions methods to the rescue!!

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

    Usage

    if (t.Isnt(typeof(TypeA)))
    {
       ...
    }
    
    0 讨论(0)
  • 2021-01-03 20:02

    if you want not only check, you can use as operator.

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

    In this way, if you want use a type after check, you avoid double casting..

    0 讨论(0)
提交回复
热议问题