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


70

这工作正常:

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

但是我如何检查value是否是一个没有设置的字符串数组 expectedTypetypeof(string[])?我想做类似的事情:

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

这可能吗?


1
您是否想知道对象是否被声明为字符串[]。还是如果object []仅包含某种类型的实例?
克里斯·马拉斯蒂·乔治

Answers:


120

使用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))

16

您可以使用扩展方法(不是必须这样做,而是使其更具可读性):

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

然后使用:

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

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

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

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

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

有了它,您可以查找List,IEnumerable ...并获取T。


7

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

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

-2

您实际上是否需要知道数组的类型?还是只需要元素具有某种类型?

如果是后者,则可以仅过滤与所需内容匹配的元素:

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

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

对数组适用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.