如何将对象转换为对象[]

本文关键字:对象 转换 | 更新日期: 2023-09-27 18:29:12

我有一个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<object>().ToArray();
        string[] strings = Array.ConvertAll(array, item => item.ToString());
        // ...
    }
}

我想这还可以,但看起来很复杂。有人有更简单的方法吗?

如何将对象转换为对象[]

您不需要将其转换为数组,然后使用LINQ。你可以用一种更流的方式来做,只在最后转换成一个数组:

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

(请注意,这将保留null,而不是抛出异常。这对任何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]);

在大多数情况下,这可能有点过头了,浪费了垂直空间,所以我会使用类似于接受答案的东西,并使用可选的null条件运算符?来检查源是否是数组:

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