使用父级和子级列表到IEnumerable

时间:2011-08-13 17:09:04

标签: c#

鉴于以下类别:

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

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

为什么我不能这样做:

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

,其中

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

基本上我已经有了一个适用于ContentItem类的存储库实现,我也想使用同一个存储库来处理Widget类,因为Widget具有相同的基本属性,并且只引入了一些新的只包含一些信息(它们来自IWidget接口)并且对存储库应该如何处理类没有任何影响)。我不想创建另一个存储库类只是用ContentItem替换Widget的所有出现。

我应该通过显式指定强制转换或更改我的存储库(或存储库接口,我也有)来进行更改吗?如果可能的话,我想避免各种构造,如AsEnumerable(),ToList()或显式转换。

1 个答案:

答案 0 :(得分:2)

因为ContentItem不是Widget - 反之亦然。即使这样IEnumerable<ContentItem>List<Widget>不同,您也可以通过这样的方式实现您想要的目标:

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

但是只有如果你才真正返回枚举,其中每个ContentItem真的是Widget