簡體   English   中英

C#:有沒有一種方法可以使用反射來調整未知類型的數組的大小?

[英]C#: Is there a way to resize an array of unknown type using reflection?

我的用戶向我傳遞了某種類型的數組,例如int []或string []。 我可以通過GetElementType輕松查詢元素的類型,並且可以找到通過GetRank,GetLength等將數組傳遞給我時的數組長度。

數組在參數列表中傳遞,因此可視化如下代碼:

    public void Resizer(params object[] objs)
    {
        foreach (object o in objs)
            Array.Resize(ref o, 3);
    }

我想做的是使用可用的有效方法的相反方法:我想調整傳遞給我的數組的大小,將長度設置為其他長度(例如在這個愚蠢的示例中為3)。

之所以這樣做,是因為在我的設置中,陣列將包含從一組雲計算服務器接收的數據,我們不知道有多少將預先響應,因此無法預分配陣列以具有正確的長度。 理想情況下,實際上,我的用戶傳入的是長度為0的數組,而我傳回的是長度為n的數組,這表示我從作為查詢的服務器獲得了n條回復。

我不能用Array.Resize(ref T,int)做到這一點,因為在編譯時我不知道T。

有沒有辦法做到這一點?

這應該工作:

static void Resize(ref Array array, int newSize) {        
    Type elementType = array.GetType().GetElementType();
    Array newArray = Array.CreateInstance(elementType, newSize);
    Array.Copy(array, newArray, Math.Min(array.Length, newArray.Length));
    array = newArray;
}

為什么不創建所需大小的新數組呢? 然后從您要調整大小的數組中填充它,將不存在的值設置為一些默認值。

萬一有人好奇,我最終將代碼切換為使用List

我同意應使用List(Of T)的評論,但如果要將數組復制到相同類型的新數組中,則可以執行以下操作。

// Your passed in array.
object[] objs = new object[5] {1,2,3,4,5};

// Create an array of the same type.
Array a = Array.CreateInstance(objs[0].GetType(), objs.Length+3);

// Copy in values.
objs.CopyTo(a,0);

我想我只是切換到使用列表,但這太可惜了。 該代碼看起來會有些混亂,並且由於我的用戶基本上處於第一學期的水平,所以每件事都會使他們的生活變的不好。 但是我懷疑你們中的人也看不到這樣做的方法。 那好吧....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM