Ein*_*jar 11 c# generics reflection list
我通过反射实例化一个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);
Run Code Online (Sandbox Code Playgroud)
我在列表上看到了这种奇怪的行为:
如果我通过反射与它接口,它似乎表现正常,但是如果我尝试将它转换为它的实际类型:
List<int[]> list = (List<int[]>)instance;
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
无法将类型为'System.Collections.Generic.List`1 [System.Int32 [*]]'的对象强制转换为'System.Collections.Generic.List`1 [System.Int32 []]'.
可能导致此问题或如何解决问题的任何想法?我在.net 4.0上的visual studio 2010 express工作.
Bar*_*zKP 11
问题是由MakeArrayType
功能引起的.您使用它的方式是创建一个具有一维的多维数组,这与一维数组(向量)不同.
从文档:
公共语言运行库区分向量(即,始终从零开始的一维数组)和多维数组.始终只有一个维度的向量与恰好只有一个维度的多维数组不同.您不能使用此方法重载来创建矢量类型; 如果rank为1,则此方法重载将返回恰好具有一个维度的多维数组类型.使用MakeArrayType()方法重载来创建矢量类型.
更改:
Type typeIntArray = typeInt.MakeArrayType(1);
Run Code Online (Sandbox Code Playgroud)
对此:
Type typeIntArray = typeInt.MakeArrayType();
Run Code Online (Sandbox Code Playgroud)
创建一个普通的一维向量.
归档时间: |
|
查看次数: |
222 次 |
最近记录: |