2012-12-04 49 views
4

我需要爲具有指定數量索引的基類型數組創建類型實例。從本質上講,我需要這樣我可以撥打下列方法...如何獲取描述基類型數組的類型?

public Type GetArrayOfType(Type baseType, int numOfIndexes) 
{ 
    return /* magic does here */ 
} 

這樣調用該函數將給出的結果...

GetTypeArray(typeof(bool), 1) == typeof(bool[]) 
GetTypeArray(typeof(bool), 2) == typeof(bool[,]) 
GetTypeArray(typeof(bool), 3) == typeof(bool[,,]) 

唯一的解決辦法我能想出在下面......

public Type GetArrayOfType(Type baseType, int numOfIndexes) 
{ 
    List<int> indexes = new List<int>(); 
    for(int i=0; i<numOfIndexes; i++) 
     indexes.Add(1); 

    return Array.CreateInstance(baseType, indexes.ToArray()).GetType(); 
} 

這並不工作,但有爲了再調用的GetType(創建所需類型的實例)不似乎很理想。必須有辦法生成類型而不創建實例。或者在那裏?

回答

8

你可以這樣說:

public Type GetArrayOfType(Type baseType, int numOfIndexes) { 
    return numOfIndexes == 1 ? baseType.MakeArrayType() : baseType.MakeArrayType(numOfIndexes); 
} 

有一個小技巧還有:雖然你可以通過1MakeArrayType(int),它是要生產類型將是一樣的由MakeArrayType返回。以下是文檔摘錄:

公共語言運行時會區分向量(即始終爲零的一維數組)和多維數組。一個向量總是隻有一個維度,它不同於恰好只有一個維度的多維數組。您不能使用此方法重載來創建矢量類型;如果rank1,則此方法重載將返回恰好具有一個維度的多維數組類型。使用MakeArrayType()方法重載創建矢量類型。

+2

爲什麼'MakeArrayType(1)'是不一樣'MakeArrayType()',請參閱文檔http://msdn.microsoft.com/en-us/library/w0ykk2sw.aspx –

+1

非常感謝。有時你只知道必須有更好的方法。 –

+0

@TimS。非常感謝你!我編輯了答案以包含來自文檔的描述。 – dasblinkenlight