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

C# 如何将对象转换为对象[],c#,C#,我有一个对象,其值可以是几种数组类型之一,如int[]或string[],我想将其转换为string[]。我的第一次尝试失败了: void Do(object value) { if (value.GetType().IsArray) { object[] array = (object[])value; string[] strings = Array.ConvertAll(array, item => item.ToString());

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

void Do(object value)
{
    if (value.GetType().IsArray)
    {
        object[] array = (object[])value;
        string[] strings = Array.ConvertAll(array, item => item.ToString());
        // ...
    }
}
出现运行时错误
时,无法将类型为“System.Int32[]”的对象强制转换为类型为“System.object[]”
,这在retrospect中很有意义,因为我的
int[]
不包含装箱整数

经过反复研究,我得出了以下工作版本:

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

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

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

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

(请注意,这将保留空值,而不是引发异常。对于任何
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]);

下面的解决方案在JAVA中

公共静态对象[]ConvertObjectToObject数组(){
Objects firstObject=新对象();
返回新对象[]{firstObject};
}

在上面的返回语句中,您正在将一个对象转换为一个对象数组。

看起来不错。你还想要什么?数组总是很复杂的。通用列表更容易使用。:)我认为林克的演员阵容不使用拳击。这是真的吗?如果是这样的话,我们在转换某些类型时就不会有任何问题吗?@LuisFilipe:是的,它有拳击功能。它不会从(比如说)
byte
转换到
int
,但它会装箱。@JonSkeet:为什么Linq的Cast不能从byte转换到int。根据我的研究,这不是自定义转换(至少它不会出现在VS元数据中)。也许这太离题了…@LuisFilipe:在.NET3.5SP1之前,它确实做到了。但现在它基本上对
T
-进行了转换,并且假设该值是一个装箱的
字节
,尝试将其解装箱到
int
将失败…@JonSkeet:感谢您的启发;尽管我需要阅读文献才能完全理解它。我的问题特别拒绝了
(object[])value
,因为可能存在运行时错误。对不起,不是“…value可能是几种数组类型之一,如
int[]
string[]
。”在这两种情况下,使用“as”的初始转换都将失败。没有异常,但
数组
将为空。数组类型不是协变的。(比双向飞碟更好?)谢谢@MarcL。像往常一样,我没有仔细阅读这个问题,我想到了
Interop.Excel中的
动态
对象[,]
数组
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<object>().Select(Convert.ToString).ToArray();