2011-03-11 112 views
47

这工作得很好:如何检查对象是否是某种类型的数组?

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

但是我怎么检查是否值是不设置expectedTypetypeof(string[])一个字符串数组?我想做类似的事情:

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

这可能吗?

+1

是否想知道对象是否声明为字符串[]。或者如果一个对象[]仅包含某种类型的实例? – 2011-03-11 15:34:26

回答

81

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

你确实需要知道数组的类型?或者你只需​​要元素是某种类型的?

如果是后者,你可以简单地仅过滤就是你想要的元素:

string[] strings = array.OfType<string>(); 
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>()); 
3
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

5

最整洁和安全的方式做到这一点是找到正在使用MakeArrayType

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