This works fine:
var expectedType = typeof(string);
object value = \"...\";
if (value.GetType().IsAssignableFrom(expectedType))
{
...
}
<
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())
{
...
}
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.
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>();
if(objVal.GetType().Name == "Object[]")
true for array
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))
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>());