2013-10-06 67 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