这很好用:
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)) // <---
{
...
}
这可能吗?
答案 0 :(得分:101)
使用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))
答案 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