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

C#.NetArraysReflectionTypes

C# Problem Overview


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?

C# Solutions


Solution 1 - C#

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 - C#

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 - C#

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.

Solution 4 - C#

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 5 - C#

This is another sample,

using System;
using System.Collections.Generic;

public static class Program
{
	public static void Main()
	{
		Type type = typeof(string[]);
		// string[], int[], char[], List<MyData>, IList<MyData>, IEnumarable<MyData>  =====> console write "True",
		// string, int, MyData etc ==== does not write 
		
		if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IList<>))
		{
			Type itemType = type.GetGenericArguments()[0];
			Console.WriteLine("True");
		}

		if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
		{
			Type itemType = type.GetGenericArguments()[0];
			Console.WriteLine("True");
		}

		if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>))
		{
			Type itemType = type.GetGenericArguments()[0];
			Console.WriteLine("True");
		}
		
		if (type.IsArray)
		{
			Console.WriteLine("True");
		}		
	}
}

public class MyData
{
	public string Name { get; set; }
}

Solution 6 - C#

Do you actually need to know the type of the array? Or do you only need the elements to be of a certain type?

If the latter, you can simply filter only the elements that match what you want:

string[] strings = array.OfType<string>();

Solution 7 - C#

if(objVal.GetType().Name == "Object[]")

true for array

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAllrameestView Question on Stackoverflow
Solution 1 - C#StefanView Answer on Stackoverflow
Solution 2 - C#AliostadView Answer on Stackoverflow
Solution 3 - C#xanatosView Answer on Stackoverflow
Solution 4 - C#NatxoView Answer on Stackoverflow
Solution 5 - C#Hakan KÜÇÜKView Answer on Stackoverflow
Solution 6 - C#jdmichalView Answer on Stackoverflow
Solution 7 - C#snbView Answer on Stackoverflow