如何检查对象是否是某种类型的数组?
问题描述:
这工作得很好:如何检查对象是否是某种类型的数组?
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)) // <---
{
...
}
这可能吗?
答
使用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))
答
你确实需要知道数组的类型?或者你只需要元素是某种类型的?
如果是后者,你可以简单地仅过滤就是你想要的元素:
string[] strings = array.OfType<string>();
答
可以使用扩展方法(不是说你有,但使它更具可读性):
public static class TypeExtensions
{
public static bool IsArrayOf<T>(this Type type)
{
return type == typeof (T[]);
}
}
然后用:
Console.WriteLine(new string[0].GetType().IsArrayOf<string>());
答
value.GetType().GetElementType() == typeof(string)
作为额外的奖励(但我不是100%确定。这是我使用的代码...)
var ienum = value.GetType().GetInterface("IEnumerable`1");
if (ienum != null) {
var baseTypeForIEnum = ienum.GetGenericArguments()[0]
}
这个你可以看看名单,IEnumerable的......并获得T.
+15
这是一个有风险的魔法字符串 – 2012-11-17 11:16:06
答
最整洁和安全的方式做到这一点是找到正在使用MakeArrayType
:
var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType() == expectedType.MakeArrayType())
{
...
}
是否想知道对象是否声明为字符串[]。或者如果一个对象[]仅包含某种类型的实例? – 2011-03-11 15:34:26