列表到IEnumerable与父类和子类

本文关键字:子类 父类 IEnumerable 列表 | 更新日期: 2023-09-27 18:05:35

给定以下类:

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

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

为什么我不能这样做:

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

,

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

本质上我已经有一个存储库实现工作在ContentItem类,我想使用相同的存储库也工作在Widget类基本上,因为小部件具有相同的基本属性,只引入了一些新的,只是持有一些信息(他们来自IWidget接口),没有任何影响存储库应该如何处理类)。我不想制作另一个存储库类,只是为了用Widget替换ContentItem的所有出现。

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

列表到IEnumerable与父类和子类

因为ContentItem不是Widget -这是反过来的。即使IEnumerable<ContentItem>List<Widget>不同,您也可以通过这样做来实现您想要的:

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

但这将只工作如果你真的返回一个枚举,其中每个ContentItem实际上是一个Widget