演员List< object>使用反射到未知的T[]

本文关键字:未知 反射 List object 演员 | 更新日期: 2023-09-27 18:18:21

我在另一个问题上发现了类似的问题,但我无法解决我的问题,因为我仍然是c#的新手。

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

和需要转换为int[]的List

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:不能从源类型转换到目标类型。来。Enumerable+c__Iterator0 1[System.Int32].MoveNext () System.Collections.Generic.List 1[System.Int32]。AddEnumerable (IEnumerable ' 1 enumerable)

作为我需要使用

将casteObject分配给privateField的最后一件事
field.SetValue(this, castedObject);

编辑:我会试着得到更多的信息,但是为了更好地解释我要做的事情,我将解释用例。

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

我正在做序列化和反序列化标记字段与自定义属性,我希望能够序列化数组和列表的任何基本类型

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

演员List< object>使用反射到未知的T[]

我不知道你做错了什么。

下面是一个演示的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();
}

I do得到一个int型数组对应的输出。张贴的代码似乎工作得很好。你的问题一定在别处。会不会是你实际上没有发送属性List<object>或者列表中包含了不是int类型的东西?

改变这一行:

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

:

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

给了我那个例外。

也许你想要OfType而不是Cast ?

如果您在castMethod检索中替换字符串,它再次"工作",但当然它会过滤掉该字符串。

此处需要更多信息

嗯,你有源代码List<object>,可以得到它的长度。

你可以调用Array。用你的类型和长度创建实例。然后你所要做的就是把这些项目一个一个地移过去。

为什么要用linq呢?