我有一些代码可以从表达式树中提取一个盒装的可插入实例。代码需要将其转换为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
答案 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
集合objects
到object
的集合,您必须将每个项目转换为mogrify
(即将它们装箱)。
答案 2 :(得分:0)
没有测试过,但理论上你可以使用Linq将其转换为IEnumerable<object>
:
object [] values = ((IEnumerable)list).Cast<object>().ToArray();