我有一些代码可以从表达式树中提取一个装箱的可枚举实例。代码需要将其转换为object[]。
到目前为止,我已经摆脱了假设它会是这样的情况,IEnumerable<string>因此将其投射到.ToArray().
情况发生了变化,现在也可能是IEnumerable<int>。我仍然需要将盒子更改为 anobject[]并且并不真正关心类型是什么。
object list = Expression.Lambda(methodCallExpression.Object).Compile().DynamicInvoke();
var enumerable = (IEnumerable<string>)list;
object[] values = enumerable.ToArray();
Run Code Online (Sandbox Code Playgroud)
更新:
字符串是引用,整数是值类型。我发现虽然我可以装箱对整数数组的引用,但我不能假装它是装箱整数数组,因为整数不能装箱。
System.Core.dll 中发生“System.InvalidCastException”类型的异常,但未在用户代码中处理其他信息:无法转换“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();
Run Code Online (Sandbox Code Playgroud)
Cast只需之前致电ToArray:
object[] values = enumerable.Cast<object>().ToArray();
Run Code Online (Sandbox Code Playgroud)
请注意,这会转换每个项目,而不是整个集合。您不能将 的集合“转换”ints为 的集合objects,您必须将每个项目转换为 an object(即将它们装箱)。