创建项目<u>的IList <t>?</u> </t>

时间:2009-12-17 14:03:00

标签: c# .net generics c#-3.0

所以我有一个对象,让我们说Item<U>。我想创建一个包含这些项集合的(n)(I)List<T>。我遇到的问题是Item<U>的集合可以包含任意数量的U类型。

我无法弄清楚的是用于IList的签名。我尝试了IList<Item<T>>,但因为我没有(在IList要使用的类中)有T的定义(无论如何我说varys)我不能使用这个签名。达到此要求的最佳方法是什么?

6 个答案:

答案 0 :(得分:5)

您需要为Item<U>添加非通用接口,并从这些接口中进行收集。

您无法创建IList<Item<T>>的集合,其中T是您要放入同一列表的许多不同对象类型的基本类型。这是co(ntra) - 方差,特别禁止这种情况。

所以你需要添加一些常见的东西,而不是通用的东西,然后列出那个。例如,您可以Item<T>实施IItem,然后创建IList<IItem>

这是你能做的最好的事情。

答案 1 :(得分:2)

IList意味着拥有一种类型。要确定某些内容是否为“单一类型”,您必须扩展所有类型参数。以IList<Item<T>>为例,T必须是特定实例的唯一内容。

例如,您可以为Animal选择T,然后继续在Dog中放置CatBearIList个实例}。但你不能把任意类型放在那里;它们必须能够转换为您为T指定的类型。如果您的类型 且以这种方式不相关,除了为您的列表设置非通用接口之外,您没有任何选择。您还可以考虑为所有符合条件的项目定义T的接口类型。

一旦确定T将是什么,您就可以使您的方法具有通用性:

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

答案 2 :(得分:1)

您可以将方法设为通用,例如:

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

答案 3 :(得分:1)

.Net 3有点痛苦,因为不同U的所有项目都被视为独立类型。要使其工作,您必须手动引入此类型的接口:

interface IItem{}

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

现在你可以:

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

或者你可以坚持使用非通用列表。

答案 4 :(得分:0)

你可以试试这个

class Item<U>
{
   ...
}


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

....
IList<Item> itemList;

答案 5 :(得分:0)

你只想要一个IList<Item<U>>。关键是泛型T名称中的IList<T>只是一个占位符 - 它没有任何特殊含义。你想要一个Item<U>的列表,所以只需要一个。

现在,这当然意味着包含此IList的方法/类本身在U中是通用的,但这似乎取决于您的问题的条款。