简体   繁体   中英

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

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

but

if (t isnt TypeA)
{
   ...
}   

doesn't work.

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

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

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.

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

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

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

Check below example for getType() :

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

string s;
s.GetType();

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM