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

Posted

技术标签:

【中文标题】如何检查对象是不是是某种类型的数组?【英文标题】:How to check if object is an array of a certain type?如何检查对象是否是某种类型的数组? 【发布时间】:2011-07-13 14:10:19 【问题描述】:

这很好用:

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

     ...

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

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

     ...

这可能吗?

【问题讨论】:

您想知道对象是否被声明为字符串[]。或者如果一个 object[] 只包含某种类型的实例? 【参考方案1】:

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

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

 ...

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

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

【讨论】:

【参考方案2】:

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

public static class TypeExtensions

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

然后使用:

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

【讨论】:

【参考方案3】:
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】:

找到的最简洁和最安全的方法是使用MakeArrayType

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

     ...

【讨论】:

【参考方案5】:

你真的需要知道数组的类型吗?还是您只需要元素属于某种类型?

如果是后者,您可以只过滤与您想要的元素匹配的元素:

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

【讨论】:

【参考方案6】:
if(objVal.GetType().Name == "Object[]")

数组为真

【讨论】:

以上是关于如何检查对象是不是是某种类型的数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查对象是不是是Java中的集合类型?

Python:检查对象是不是不是“数组类型”

如何检查变量是不是是javascript中的类型化数组?

如何在 jQuery 中解析 JSON 数组?

打字稿类型检查不适用于数组过滤器

检查文件是不是属于某种类型