如何将对象转换为对象

我有一个object其值可能是几个数组类型之一,如int[]string[] ,我想将其转换为string[] 。 我的第一次尝试失败了

 void Do(object value) { if (value.GetType().IsArray) { object[] array = (object[])value; string[] strings = Array.ConvertAll(array, item => item.ToString()); // ... } } 

运行时错误Unable to cast object of type 'System.Int32[]' to type 'System.Object[]' ,这在回顾过程中很有意义,因为我的int[]不包含盒装整数。

我四处寻找这个工作版本:

 void Do(object value) { if (value.GetType().IsArray) { object[] array = ((Array)value).Cast().ToArray(); string[] strings = Array.ConvertAll(array, item => item.ToString()); // ... } } 

我想这没关系,但看起来很复杂。 谁有更简单的方法?

您不需要将其转换为数组, 然后使用LINQ。 您可以采用更流式的方式进行,最后只转换为数组:

 var strings = ((IEnumerable) value).Cast() .Select(x => x == null ? x : x.ToString()) .ToArray(); 

(注意,这将保留空值,而不是抛出exception。对于任何IEnumerable ,它也没有问题,而不仅仅是数组。)

.ToArray在大多数情况下会进行多次内存分配,但几乎没有办法:

 object value = new[] { 1, 2.3 }; IList list = value as IList; string[] strings = new string[list.Count]; for (int i = 0; i < strings.Length; i++) strings[i] = Convert.ToString(list[i]); 

在大多数情况下,这可能有点过度和浪费垂直空间,所以我会使用类似已接受的答案与可选的空条件运算符? 检查源是否是数组:

 string[] strings = (value as Array)?.Cast().Select(Convert.ToString).ToArray(); 
 void Do(object value) { if (value.GetType().IsArray) { string[] strings = ((object[]) value).Select(obj => Convert.ToString(obj)).ToArray(); } }