2014-02-26 98 views
2

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

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

现在,这似乎罚款,直到我想使用类似这是目前宣布为DoSomethingTo(PageList<Page> pageList)DoSomethingTo(this)PageList<T>中调用的方法。这给了我一个铸造错误。

我希望能够做什么,因为你可能已经想通了,是到所属分类类中使用DoSomething(this)无论从PageList<T>类或内。

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

+0

你能告诉你现在正在做什么以及你得到的是什么错误信息吗? – jmcilhinney

回答

1

您的问题是PageList<Page>PageList<Category>不是协变。这些是完全无关的类型。尽管T是派生类型,但最终的泛型集合却不是。

如果你想想看,这是正确的,否则就什么也没有从传递CatagoryList给需要一个PageList可能再添加一个Page的产品类别集合这将是无效的函数阻止你。

为了解决这种情况,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) 
{ 
} 
+0

我尝试过这样的事情,但也许我只是在某个地方的某个地方找不到它。我明天再打一次。谢谢! – RobinHood70

+0

啊,我现在记得这个问题。这样做的问题是IPageList 不再是KeyedCollection,所以DoSomethingTo无法遍历它。 – RobinHood70

+0

哦,同样重要的是,我也需要它可以索引。 我在猜我在问不可能吗? – RobinHood70