派生类的通用KeyedCollection

时间:2014-02-26 08:54:18

标签: c# generics covariance

我环顾四周并没有找到任何与我的问题完全匹配的东西,尽管this肯定很接近。基本上,我有一个Page对象的KeyedCollection作为基础,我希望强类型的派生对象集合来自它。具体来说,我有:

public class Page public class Category : Page public class PageList<T> : KeyedCollection<string, T> where T : Page public class CategoryList : PageList<Category>

现在,这似乎很好,直到我想使用PageList<T>之类的DoSomethingTo(this)来调用DoSomethingTo(PageList<Page> pageList)内的方法,该方法当前被声明为DoSomething(this)。这给了我一个投射错误。

我希望能够做到的是,您可能已经想到的是在PageList<T>中使用{{1}} CategoryList类。

我如何做这项工作......或者我呢?我尝试过与上面链接的问题中提出的方法类似的方法,但我无法得到任何工作。谢谢!

1 个答案:

答案 0 :(得分:1)

您的问题是PageList<Page>PageList<Category>不是协变的。这些是完全不相关的类型。即使T是派生类型,生成的泛型集合也不是。

如果您考虑一下,这是正确的,因为否则就没有什么可以阻止您将CatagoryList传递给期望PageList然后可以添加Page的函数对于无效的catagory集合。

为了帮助解决这类问题,C#4增加了对协变接口的支持。通过使用输入和输出关键字限制您可以执行的操作,这些允许有限的协方差。

您的关联问题使用了这个,您也可以这样做。

interface IPageList<out T> where T : Page
{
}

public class PageList<T> : KeyedCollection<string, T>, IPageList<T> where T : Page
{
}


DoSomethingTo(IPageList<Page> pageList)
{   
}