c# - 使用反射将 List<object> 转换为未知的 T[]

标签 c# reflection casting

我在另一个问题上发现了类似的东西,但我无法解决我的问题,因为我在 C# 中还是个新手。

我有

System.Type type; // for example int[]
System.Type elementType = type.GetElementType(); //for example int

还有一个我需要转换为 int[] 的列表

object valueObj; //is my List<object> i want to cast to int[]

我正在尝试以下操作:

MethodInfo castMethod = typeof(Enumerable).GetMethod("Cast")
    .MakeGenericMethod( new System.Type[]{ elementType } );
MethodInfo toArrayMethod = typeof(Enumerable).GetMethod("ToArray")
     .MakeGenericMethod( new System.Type[]{ elementType } );

var castedObjectEnum = castMethod.Invoke(null, new object[] { valueObj });
var castedObject = toArrayMethod.Invoke(null, new object[] { castedObjectEnum });

在最后一行我得到了这个运行时异常

InvalidCastException:无法从源类型转换为目标类型。 System.Linq.Enumerable+c__Iterator01[System.Int32].MoveNext () System.Collections.Generic.List1[System.Int32].AddEnumerable(IEnumerable`1 可枚举)

作为最后一件事,我需要使用 将 casteObject 分配给 privateField

field.SetValue(this, castedObject);

编辑: 我会尝试获取更多相关信息,但为了更好地解释我正在尝试做的事情,我将解释用例。

我在 json 中将一些类字段序列化到磁盘,然后当我反序列化时,我得到一个列表,我在其中序列化了一个 int/bools/string 的基本数组

我正在通过使用自定义属性标记字段来进行序列化和反序列化,我希望能够序列化任何基本类型的数组和列表

我会仔细检查并获得更多信息

最佳答案

我不知道你做错了什么。

这是一个LINQPad演示的程序,它似乎使用了与您相同的调用,但我确实得到了正确类型数组的输出。

void Main()
{
    object valueObj = new List<object> { 1, 2, 3 };
    Type type = typeof(int[]);

    Type elementType = type.GetElementType();
    MethodInfo castMethod = typeof(Enumerable).GetMethod("Cast")
        .MakeGenericMethod( new System.Type[]{ elementType } );
    MethodInfo toArrayMethod = typeof(Enumerable).GetMethod("ToArray")
        .MakeGenericMethod( new System.Type[]{ elementType } );

    var castedObjectEnum = castMethod.Invoke(null, new object[] { valueObj });
    var castedObject = toArrayMethod.Invoke(null, new object[] { castedObjectEnum });
    castedObject.Dump();
}

确实得到一个对应于整数数组的输出。发布的代码似乎工作得很好。你的问题一定在别处。难道你实际上并没有发送属性 List<object>或者该列表包含不是 int 的内容?

只是改变这一行:

object valueObj = new List<object> { 1, 2, 3 };

为此:

object valueObj = new List<object> { 1, 2, 3, "Test" };

给我那个异常(exception)。

也许你想要OfType而不是 Cast

如果您替换 castMethod 中的字符串检索,它再次“起作用”,但当然它会过滤掉该字符串。

此处需要更多信息。

关于c# - 使用反射将 List<object> 转换为未知的 T[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17114110/

相关文章:

c# - 在 xaml 项目中使用 CoreWindow 交换链,为什么没有绘制?

c# - 如何从 Windows 应用商店应用程序中的隐藏代码绑定(bind)到 c# 中的自定义附加属性?

c# - 替换方法的 MethodBody 中的指令

postgresql - 将 varchar 字段的类型更改为整数 : "cannot be cast automatically to type integer"

C#解析带有ajax加载内容的网站

c# - 从列表中删除最近添加的项目

java - 从类中获取接口(interface)注释方法

Java:按名称实例化具体实现

c++ - 如何根据条件推断可以返回类型的函数类型?

python - Pybind11 类型错误