11

我正在通过反射实例化一个一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);

我在列表本身上看到了这种奇怪的行为:

将列表实例作为对象监视

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

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 中工作。

4

2 回答 2

11

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

文档中:

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

改变:

Type typeIntArray = typeInt.MakeArrayType(1);

对此:

Type typeIntArray = typeInt.MakeArrayType();

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

于 2013-10-06T20:59:25.410 回答
3

MSDN所说MakeArrayType(int)

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

于 2013-10-06T21:01:15.637 回答