2013-10-06 37 views
11

我通过反射来实例化单维Int32阵列的List<T>。当我实例使用列表:无法投射列表<int[*]>到列表<int[]>用反射实例化

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 []]'。

任何想法可能导致这种情况或如何解决它?我正在使用.net 4.0上的visual studio 2010 express。

回答

10

该问题是由MakeArrayType函数引起的。您使用它的方式创建了一维的多维数组,这与一维数组(矢量)不同。

documentation

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

变化:

Type typeIntArray = typeInt.MakeArrayType(1); 

这样:

Type typeIntArray = typeInt.MakeArrayType(); 

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

+0

我很好奇为什么它会在查看当地人时导致奇怪的列表行为,但现在这个问题已经解决了。谢谢。 – Einherjar

3

什么MSDN说,大约MakeArrayType(int)

您不能使用此方法重载来创建矢量型;如果rank 为1,则此方法重载返回多维数组类型, 恰好有一个维度。使用MakeArrayType()方法过载 来创建矢量类型。

+0

谢谢,这也解答了我[]和[*]之间的混淆! – Einherjar