在不知道显式类型的情况下将装箱的可枚举对象转换为对象数组

Dan*_*ell 4 c#

我有一些代码可以从表达式树中提取一个装箱的可枚举实例。代码需要将其转换为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)

D S*_*ley 5

Cast只需之前致电ToArray

object[] values = enumerable.Cast<object>().ToArray();
Run Code Online (Sandbox Code Playgroud)

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