2011-08-13 39 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