【问题标题】:Convert boxed ienumerable into object array without knowing explicit type在不知道显式类型的情况下将装箱的 ienumerable 转换为对象数组
【发布时间】:2015-10-05 13:49:25
【问题描述】:

我有一个小代码,可以从表达式树中拉出一个装箱的可枚举实例。代码需要将其转换为object[]。

到目前为止,我已经假设它将是IEnumerable<string>,因此将其转换为.ToArray()

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


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

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

更新:

字符串是引用,整数是值类型。我发现虽然我可以对整数数组的引用进行装箱,但我不能假装它是一个装箱的整数数组,因为整数不能装箱。

“System.InvalidCastException”类型的异常发生在 System.Core.dll 但未在用户代码中处理 附加 信息:无法转换类型的对象 'System.Collections.Generic.List1[System.Int32]' to type 'System.Collections.Generic.IEnumerable1[System.Object]'。

object list = Expression.Lambda(methodCallExpression.Object).Compile().DynamicInvoke(); 
var enumerable = (IEnumerable<object>)list; 
object[] values = enumerable.ToArray();

【问题讨论】:

  • 为什么不依赖var list 处理这个变量而不把它转换成数组呢?
  • "int's cannot be boxed" 不确定您的意思——它们可以被装箱,但仅仅铸造集合并不能为你做到这一点。

标签: c#


【解决方案1】:

之前在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);
  }

【讨论】:

  • 我认为这不适用于IEnumerable&lt;int&gt;,而且绝对不会在低于 4.0 的 C# 中使用。 IEnumerable&lt;T&gt; 从 C# 4.0 开始是协变的,但是 AFAIK,方差不适用于值类型。它适用于IEnumerable&lt;string&gt;(在 C#>=4.0 上)
  • @Jcl 我可以确认这不起作用,我已经测试并酌情更新了问题
【解决方案2】:

ToArray之前调用Cast

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

请注意,这会转换每个 item,而不是整个 collection。您不能将ints 的集合“转换”为objects 的集合,您必须将每个项目转换为object(即装箱)。

【讨论】:

    【解决方案3】:

    尚未对其进行测试,但理论上您可以使用 Linq 将其转换为 IEnumerable&lt;object&gt;

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 2022-10-24
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多