如何检查对象是不是是某种类型的数组?
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[]")
数组为真
【讨论】:
以上是关于如何检查对象是不是是某种类型的数组?的主要内容,如果未能解决你的问题,请参考以下文章