【发布时间】: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.List
1[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#