2012-03-23 16 views
0

過去,我有這個方法的類型的類的實例:使用函數來創建基礎上,通過

internal static void AssignNewArrayItem(ref Xml.CLASSNAME[] Items, Xml.CLASSNAME Item) 
{ 
    if (Items != null) 
    { 
     Array.Resize(ref Items, Items.Length + 1); 
     Items[Items.Length - 1] = Item; 
    } 
    else 
     Items = new Xml.CLASSNAME[] { Item }; 
} 

目前我有大約10重載版本,其中CLASSNAME不同,但他們都做了詳細一樣。有沒有什麼辦法可以將CLASSNAME作爲一個通用對象,並投入變量以達到相同的結果?

如果我以錯誤的方式解決這個問題,我願意接受其他建議以獲得相同的結果。

+1

我不知道你的架構的其餘部分繼承的對象,但你有沒有使用任何理由[List ](http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx)。它爲您動態增長,而不需要您正在執行的數組大小調整。 – pstrjds 2012-03-23 14:33:42

+0

更具體地說,List只會偶爾調整底層數組的大小,以便大多數操作不涉及調整大小,而不是每次調整大小。它會跟蹤底層數組中的哪些元素實際上是「有效的」,以便像Count這樣的事情仍然可以按照您的需要工作。 – Servy 2012-03-23 14:43:20

+0

該數組位於使用xsd.exe生成的XML映射文件中,因此我不認爲在這種情況下可以使用List <>。 – webnoob 2012-03-23 14:45:47

回答

2
internal static void AssignNewArrayItem<T>(ref T[] Items, T Item) 
    { 
     if (Items != null) 
     { 
      Array.Resize(ref Items, Items.Length + 1); 
      Items[Items.Length - 1] = Item; 
     } 
     else 
      Items = new T[] { Item }; 
    } 
+0

完美,謝謝。將在8分鐘內接受答案。 – webnoob 2012-03-23 14:33:45

+1

很高興幫助。但正如其他人提到的,你可以使用列表或arraylist,而不是T的數組,以便不做任何與數組調整有關的任何事情 – daryal 2012-03-23 14:39:05

+0

該數組位於使用xsd.exe生成的XML映射文件中,所以我不認爲存在在這種情況下使用List <>的方法。 – webnoob 2012-03-23 14:49:44

1

我認爲這應該工作。正如你所建議的那樣,只是使用泛型。要在您的方法來獲取此,您只需更改任何地方,將是一個變量類型與括號內的值(它並不必須是T,但是這是慣例)

internal static void AssignNewArrayItem<T>(ref T[] Items, T Item) 
{ 
    if (Items != null) 
    { 
     Array.Resize(ref Items, Items.Length + 1); 
     Items[Items.Length - 1] = Item; 
    } 
    else 
     Items = new T { Item }; 
} 

你應該可能儘管如此,該方法仍然使用constraints。你有預期的基礎類型嗎?如果是這樣,你可以這樣做:

internal static void AssignNewArrayItem<T>(ref T[] Items, T Item) 
    where T : <base class name> 
2

你有沒有嘗試過這樣的:

internal static void AssignNewArrayItem<T>(ref T[] Items, T Item) 
{ 
    if (Items != null) 
    { 
     Array.Resize(ref Items, Items.Length + 1); 
     Items[Items.Length - 1] = Item; 
    } 
    else 
     Items = new T[] { Item }; 
} 

我想用List<T>將是更好的選擇,這裏雖然。

+0

+1用於推薦列表。如果向其中添加多個元素,則調整大小可能會變得非常昂貴。 – pstrjds 2012-03-23 14:35:28

0

您可以使用泛型約束,約束將只接受來自類Xml.CLASSNAME

internal static void AssignNewArrayItem<T>(ref T[] Items, T Item) where T: Xml.CLASSNAME 
{ 
    if (Items != null) 
    { 
     Array.Resize(ref Items, Items.Length + 1); 
     Items[Items.Length - 1] = Item; 
    } 
    else 
     Items = new Xml.CLASSNAME[] { Item }; 
}