2014-02-26 122 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