我有一个可以是任何类型的对象。我要检查一下它是不是一个数组,如果是的话,我需要把它转换成一个List<object>
。我有麻烦处理的情况下,它的原始数组如下所示。在这种情况下,它不是IEnumerable<object>
。注意:我不能在这个框架中使用LINQ:
object value = SomeFunction();
if( value.GetType().IsArray )
{
try
{
List<object> l = new List<object>( (IEnumerable<object>)value );
}
catch(Exception e)
{
//here its failing because its no an object
}
}
"
不能直接转换为IEnumerable,因为协方差对值类型不起作用。Linq的答案是调用Cast
来将底层数组的每个元素强制转换为object
(在此过程中将它们装箱)。
我不确定你说的"我不能使用Linq"是什么意思,但是你可以复制Linq的Cast
会做什么:
object value = SomeFunction();
if( value.GetType().IsArray )
{
try
{
List<object> l = new List<object>();
foreach(object o in (IEnumerable)value) // implicitly cast each item to object
{
l.Add(o);
}
}
catch(Exception e)
{
//here its failing because its no an object
}
}
如果你想对引用类型使用协方差,你可以在运行时检查数组的底层类型:
List<object> l = new List<object>();
if(value.GetType().GetElementType().IsValueType)
{
foreach(object o in (IEnumerable)value)
{
l.Add(o);
}
}
else
{
l.AddRange((IEnumerable<object>)value);
}