无法将List <int [*]>强制转换为使用反射实例化的List <int []> </int []> </int [*]>

时间:2013-10-06 20:49:17

标签: c# list generics reflection

我通过反射实例化List<T>个单维Int32数组。当我使用:

实例化列表时
Type typeInt = typeof(System.Int32);
Type typeIntArray = typeInt.MakeArrayType(1);
Type typeListGeneric = typeof(System.Collections.Generic.List<>);
Type typeList = typeListGeneric.MakeGenericType(new Type[] { typeIntArray, });

object instance = typeList.GetConstructor(Type.EmptyTypes).Invoke(null);

我在列表中看到了这种奇怪的行为:

Watch of the list instance as an object

如果我通过反射与它接口,它似乎表现正常,但是如果我尝试将它转换为它的实际类型:

List<int[]> list = (List<int[]>)instance;

我得到了这个例外:

  

无法将类型为'System.Collections.Generic.List`1 [System.Int32 [*]]'的对象转换为'System.Collections.Generic.List`1 [System.Int32 []]'。< / p>

任何可能导致此问题或如何解决问题的想法?我在.net 4.0上的visual studio 2010 express工作。

2 个答案:

答案 0 :(得分:11)

问题是由MakeArrayType功能引起的。您使用它的方式是创建一个具有一维的多维数组,这与一维数组(向量)不同。

来自documentation

  

公共语言运行库区分向量(即,始终从零开始的一维数组)和多维数组。始终只有一个维度的向量与恰好只有一个维度的多维数组不同。您不能使用此方法重载来创建矢量类型;如果rank为1,则此方法重载将返回恰好具有一个维度的多维数组类型。使用MakeArrayType()方法重载来创建矢量类型。

变化:

Type typeIntArray = typeInt.MakeArrayType(1);

到此:

Type typeIntArray = typeInt.MakeArrayType();

创建一个普通的一维向量。

答案 1 :(得分:3)

MakeArrayType(int)MakeArrayType()的说法:

  

您不能使用此方法重载来创建矢量类型;如果排名   是1,这个方法重载返回一个多维数组类型   碰巧有一个维度。使用{{1}}方法重载   创建矢量类型。