将boxed ienumerable转换为对象数组而不知道显式类型

时间:2015-10-05 13:49:25

标签: c#

我有一些代码可以从表达式树中提取一个盒装的可插入实例。代码需要将其转换为object []。

到目前为止,我已经开始假设它是IEnumerable<string>并因此将其投射到.ToArray()之后。

情况已发生变化,现在也可能是IEnumerable<int>。我仍然需要将框更改为object[],并且不必关心类型是什么。

object list = Expression.Lambda(methodCallExpression.Object).Compile().DynamicInvoke();

var enumerable = (IEnumerable<string>)list;
object[] values = enumerable.ToArray();

更新:

字符串是引用,整数是值类型。我发现虽然我可以将引用加入一系列整数,但我不能假装它是一组盒装整数,因为int不能装箱。

  

类型&#39; System.InvalidCastException&#39;的例外情况发生在   System.Core.dll但未在用户代码中处理   信息:无法转换类型的对象   &#39; {System.Collections.Generic.List {1}} 1 [System.Object的]&#39;

1[System.Int32]' to type
  'System.Collections.Generic.IEnumerable

3 个答案:

答案 0 :(得分:4)

之前已在Best way to convert IList or IEnumerable to Array中回答。

或者你可以这么做:

  IEnumerable enumberable = (IEnumerable)list;

  List<object> values = new List<object>();

  foreach (object obj in enumerable)
  {
      values.Add(obj);
  }

答案 1 :(得分:1)

只需在Cast之前致电ToArray

object[] values = enumerable.Cast<object>().ToArray();

请注意,这会转换每个,而不是整个集合。你不能&#34;演员&#34; ints集合objectsobject的集合,您必须将每个项目转换为mogrify(即将它们装箱)。

答案 2 :(得分:0)

没有测试过,但理论上你可以使用Linq将其转换为IEnumerable<object>

object [] values = ((IEnumerable)list).Cast<object>().ToArray();