How to check if object is an array of a certain type?

105,105

Solution 1

Use Type.IsArray and Type.GetElementType() to check the element type of an array.

Type valueType = value.GetType();
if (valueType.IsArray && expectedType.IsAssignableFrom(valueType.GetElementType())
{
 ...
}

Beware the Type.IsAssignableFrom(). If you want to check the type for an exact match you should check for equality (typeA == typeB). If you want to check if a given type is the type itself or a subclass (or an interface) then you should use Type.IsAssignableFrom():

typeof(BaseClass).IsAssignableFrom(typeof(ExpectedSubclass))

Solution 2

You can use extension methods (not that you have to but makes it more readable):

public static class TypeExtensions
{
    public static bool IsArrayOf<T>(this Type type)
    {
         return type == typeof (T[]);
    }
} 

And then use:

Console.WriteLine(new string[0].GetType().IsArrayOf<string>());

Solution 3

The neatest and securest way to do it that found is using MakeArrayType:

var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType() == expectedType.MakeArrayType())
{
     ...
}

Solution 4

value.GetType().GetElementType() == typeof(string)

as an added bonus (but I'm not 100% sure. This is the code I use...)

var ienum = value.GetType().GetInterface("IEnumerable`1");

if (ienum != null) {
    var baseTypeForIEnum = ienum.GetGenericArguments()[0]
}

with this you can look for List, IEnumerable... and get the T.

Share:
105,105

Related videos on Youtube

Allrameest
Author by

Allrameest

I like turtles!

Updated on July 05, 2022

Comments

  • Allrameest
    Allrameest almost 2 years

    This works fine:

    var expectedType = typeof(string);
    object value = "...";
    if (value.GetType().IsAssignableFrom(expectedType))
    {
         ...
    }
    

    But how do I check if value is a string array without setting expectedType to typeof(string[])? I want to do something like:

    var expectedType = typeof(string);
    object value = new[] {"...", "---"};
    if (value.GetType().IsArrayOf(expectedType)) // <---
    {
         ...
    }
    

    Is this possible?

    • Chris Marasti-Georg
      Chris Marasti-Georg about 13 years
      Do you want to know if the object was declared as a string[]. or if an object[] contains only instances of a certain type?