如何检查对象是一个特定types的数组?

这工作正常:

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

但是,我怎么检查值是一个string数组没有设置expectedTypetypeof(string[]) ? 我想做一些事情:

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

这可能吗?

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

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

注意Type.IsAssignableFrom() 。 如果你想检查一个完全匹配的types,你应该检查相等( typeA == typeB )。 如果你想检查给定types是types本身还是子类(或接口),那么你应该使用Type.IsAssignableFrom()

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

你可以使用扩展方法 (不是你必须的,但是使它更易读 ):

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

然后使用:

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

最简单最安全的方法是使用MakeArrayType

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

作为额外的奖励(但我不是100%确定,这是我使用的代码…)

 var ienum = value.GetType().GetInterface("IEnumerable`1"); if (ienum != null) { var baseTypeForIEnum = ienum.GetGenericArguments()[0] } 

用这个,你可以查找列表,IEnumerable …并得到T.

你真的需要知道数组的types吗? 或者你只需​​要元素是某种types的?

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

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