Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 演员名单<;对象>;使用反射到未知的T[]_C#_Reflection_Casting - Fatal编程技术网

C# 演员名单<;对象>;使用反射到未知的T[]

C# 演员名单<;对象>;使用反射到未知的T[],c#,reflection,casting,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[] 在最后一行中,我得到了这

我在另一个问题上发现了类似的问题,但我无法解决我的问题,因为我对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[]
在最后一行中,我得到了这个运行时异常

InvalidCastException:无法从源类型强制转换为目标类型。 System.Linq.Enumerable+c__迭代器0
1[System.Int32].MoveNext()
System.Collections.Generic.List
1[System.Int32].AddEnumerable(IEnumerable`1 enumerable)

最后,我需要使用

field.SetValue(this, castedObject);
编辑: 我会尝试获取更多信息,但为了更好地解释我正在尝试做什么,我会解释用例

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

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


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

我不知道你做错了什么

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

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();
}
void Main()
{
对象值obj=新列表{1,2,3};
Type Type=typeof(int[]);
Type elementType=Type.GetElementType();
MethodInfo castMethod=typeof(可枚举).GetMethod(“Cast”)
.MakeGenericMethod(新的System.Type[]{elementType});
MethodInfo toArrayMethod=typeof(可枚举).GetMethod(“ToArray”)
.MakeGenericMethod(新的System.Type[]{elementType});
var castedObjectEnum=castMethod.Invoke(null,新对象[]{valueObj});
var castedObject=toArrayMethod.Invoke(null,新对象[]{castedObjectEnum});
castedObject.Dump();
}
我确实得到了一个对应于int数组的输出。发布的代码似乎工作正常。你的问题一定在别处。可能是您没有实际发送属性
列表
,或者列表中包含的内容不是int

只是换一句话:

object valueObj = new List<object> { 1, 2, 3 };
objectvalueobj=新列表{1,2,3};
为此:

object valueObj = new List<object> { 1, 2, 3, "Test" };
objectvalueobj=新列表{1,2,3,“Test”};
这给了我一个例外

也许你想要
的类型而不是
的演员类型

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


这里需要更多信息。

Hmm,您有源代码列表
,可以获得它的长度

你可以打电话告诉我你的类型和长度。然后你所要做的就是把这些东西一个一个地移过去


为什么要使用linq来解决这个问题?

请将这个问题转化为一个简短但完整的控制台应用程序来演示这个问题,而不是发布代码片段。这会让其他人更容易帮助你。他们真的都是int吗?它们是可以转换成整数的吗?为什么您不知道代码中此时的实际类型?反思应该很少需要,所以所有这些的答案都会帮助回答你的问题。我不知道是哪种类型,我补充了一些关于用例的解释@jonSkeet,我会再检查一遍,试着找出问题所在。你是对的,我的价值观有问题。类型为System.Collections.Generic.List`1[System.Object],并循环所有对象和Convert.ToInt32(只有三个0)。但是谢谢,我现在会朝这个方向调查,在这个案例中,我有一个列表,这就是为什么它不起作用。我会看看我需要调整什么来覆盖这个案例
object valueObj = new List<object> { 1, 2, 3, "Test" };