我有一个可以是任何类型的对象。我检查它是否是一个数组然后我需要将其转换为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
}
}
`
答案 0 :(得分:3)
您无法直接转换为IEnumerable,因为covariance doesn't work for value types。 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);
}