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