将原始或非原始动态转换为列表

时间:2015-05-21 18:09:31

标签: c#

我有一个可以是任何类型的对象。我检查它是否是一个数组然后我需要将其转换为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
  }
}

`

1 个答案:

答案 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);
}
相关问题