如何检查对象是否是某种类型的数组?

时间:2011-03-11 15:30:31

标签: c# .net arrays reflection types

这很好用:

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

但如何在不将expectedType设置为typeof(string[])的情况下检查值是否为字符串数组?我想做点什么:

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

这可能吗?

6 个答案:

答案 0 :(得分:101)

使用Type.IsArrayType.GetElementType()检查数组的元素类型。

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

小心Type.IsAssignableFrom()。如果要检查完全匹配的类型,则应检查是否相等(typeA == typeB)。如果要检查给定类型是类型本身还是子类(或接口),那么您应该使用Type.IsAssignableFrom()

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

答案 1 :(得分:15)

您可以使用扩展方法(不是必须使用更具可读性):

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

然后使用:

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

答案 2 :(得分:6)

最简单,最安全的方法是使用MakeArrayType

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

答案 3 :(得分:4)

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

作为额外奖励(但我不是100%肯定。这是我使用的代码......)

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

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

有了这个,你可以找到List,IEnumerable ......并获得T。

答案 4 :(得分:-1)

你真的需要知道数组的类型吗?或者你只需​​要某种类型的元素?

如果是后者,您只需过滤掉符合您要求的元素:

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

答案 5 :(得分:-4)

if(objVal.GetType().Name == "Object[]")
对于数组

为true