2009-12-17 25 views
2

所以我有一個對象,可以說Item<U>。我想創建一個包含這些項目集合的(n)(I)List<T>。我遇到的問題是Item<U>的集合可以有任意數量的不同類型的U。我想不出的是IList的簽名。我嘗試了IList<Item<T>>,但是因爲我沒有(在要使用IList的類中)定義了T(正如我所說的varys),我不能使用這個簽名。達到這一要求的最佳方式是什麼?創建項目<U>的IList <T>?

回答

5

您需要爲您的Item<U>添加一個非通用接口,並使這些接口不在這些接口中。

您無法創建IList<Item<T>>的集合,其中T是您希望放入同一列表的許多不同對象類型的某種基本類型。這是co(ntra) - 方法,具體禁止這一點。

因此,您需要改爲添加一些通用的東西,這不是通用的,並將其列表出來。例如,您可以使Item<T>執行IItem,並創建IList<IItem>

這是你可以做的最好的。

+0

這似乎是乾淨的方式來完成我所需要的。出於某種原因,它只是沒有到我這裏來。謝謝。 – 2009-12-17 14:14:56

1

你可以讓你的通用方法,如:

public void DoSomethingWithTheList<T>(IList<Item<T>> theList) 
{ 
    //Do that something 
} 
0

你可以試試這個

class Item<U> 
{ 
    ... 
} 


class Item : Item<object> { 
    ... 
} 

.... 
IList<Item> itemList; 
+0

您仍然無法將item 和Item 放入itemList。通常情況下,您可以使用Item {}類Item :Item {}來完成此工作。 – 2009-12-17 15:27:17

0

認爲你只是想要一個IList<Item<U>>。關鍵在於T以通用類型IList<T>的名義只是一個佔位符 - 它沒有任何特殊的含義。你想要一個Item<U>的清單,所以只需製作一個。

現在,這當然意味着包含此IList的方法/類本身在U中是泛型的,但這似乎是由您的問題的條款決定的。

2

IList是爲了保持單一類型。要確定某件事是否是「單一類型」,您必須展開所有類型參數。以您的IList<Item<T>>爲例,T必須是特定實例的唯一一件事。

例如,你可以挑選AnimalT,然後繼續把DogCat,並且Bear實例在IList。但是你不能在那裏放置任意類型的東西;他們必須能夠被轉換爲您爲T指定的類型。如果您的類型而且沒有這種關聯,則除了爲列表設置非通用接口外,沒有其他選擇。您也可以考慮爲T定義一個接口類型,以確保您的所有符合條件的項目都符合。

一旦你決定什麼T會,你就可以讓你的方法一般:

public void PrintItems<T>(IList<Item<T>> list) 
{ 
    // ... 
} 
1

它有點在.net 3痛苦的,因爲ü被當作所有項目的不同獨立類型。爲了使它工作,你必須手動引入接口,用於這種類型:

interface IItem{} 

class Item<U>:IItem {...} 

,現在你可以:

IList<IItem> list = new IList<IItem>(); 
list.Add(new Item<string>()); 
list.Add(new Item<int>()); 

或者你可以堅持非泛型列表。

相關問題