2011-08-13 37 views
1

考慮以下類:清單IEnumerable的父母子女類

public class ContentItem : IEquatable<ContentItem> 
{ 
... 
} 

public class Widget : ContentItem, IWidget 
{ 
... 
} 

爲什麼我不能做到這一點:

List<Widget> widgets = _repository.GetItems(widgetType); 

其中

_repository.GetItems(widgetType)返回IEnumerable<ContentItem>

基本上我已經有一個倉庫實現其在ContentItem類的工作,我想用同一倉庫還與Widget類基本工作,因爲小部件有相同的基本特性,只作了一些新的,只是持有的一些信息(它們來自IWidget接口),並且對存儲庫應該如何處理該類沒有任何影響)。我不想創建另一個存儲庫類來代替ContentItemWidget的所有發生。

我應該通過明確指定強制轉換還是更改我的存儲庫(或存儲庫接口,我也有)進行更改?如果可能的話,我想避免各種構造,如AsEnumerable(),ToList()或顯式轉換。

回答

2

因爲ContentItem不是Widget - 這是相反的。即使是這樣的IEnumerable<ContentItem>是從List<Widget>不同,你可以達到你想要的東西做這樣的事情:

List<Widget> widgets = _repository.GetItems(widgetType) 
            .OfType<Widget>() 
            .ToList(); 

但這隻會工作如果你真的返回一個枚舉,其中每個ContentItem確實是一個Widget

+0

我可以對存儲庫類執行任何操作以支持具有同一個存儲庫的兩個類? – mare

+0

@mare:如果你想檢索'Widget's,你必須在你的倉庫中創建/返回'Widget'類型。如果問題只是轉換,您可以在存儲庫中使用通用方法來創建/返回正確類型的實例。這一切都取決於你是如何真正在你的倉庫中構建實例 - 他們真的是「Widget」嗎? – BrokenGlass

+0

不,他們是ContentItems。我首先得到了這些,然後才引入了Widget類。 – mare