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

  • 本文关键字:原语 列表 转换 动态 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
  }
}

"

不能直接转换为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);
}

最新更新