首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将IEnumerable<Derived>转换为IEnumerable<BaseClass>

将IEnumerable<Derived>转换为IEnumerable<BaseClass>
EN

Stack Overflow用户
提问于 2011-04-14 03:58:36
回答 2查看 5.1K关注 0票数 6

我有一个类,我用它来枚举数据库中的列表。数据库中的所有表都有自己的类和自己的属性,并且它们都派生自DatabaseTableRow。

代码语言:javascript
复制
public class DatabaseLinkRowsEnumerator<T> : IEnumerator<T>, IEnumerable<T> where T : DatabaseTableRow

我有一个User类,它派生自Page,它派生自DatabaseTableRow。然后我有一个属性,它返回一个DatabaseLinkRowsEnumerator,一个用户列表。

我还有一个UI功能,可以在水平列表中显示任何页面的列表,以及图像、名称和链接。

代码语言:javascript
复制
protected string GetVerticalListModuleHtml(IEnumerable<Page> pages)

现在我要做的就是将DatabaseLinkRowsEnumerator的值传递给这个函数。User派生自Page,而DatabaseLinkRowsEnumerator是一个IEnumerator。即使当我尝试强制转换时,也会得到以下错误:

代码语言:javascript
复制
Unable to cast object of type 'Database.DatabaseLinkRowsEnumerator`1[Database.User]' to type 'System.Collections.Generic.IEnumerable`1[Database.Page]'.

我使用的是ASP.NET 2.0。有没有人知道如何在不制作完整副本的情况下进行转换/转换?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-14 04:00:24

使用.NET 2.0时,这有点笨拙,但并不太难:

代码语言:javascript
复制
public static IEnumerable<TBase> Cast<TDerived, TBase>
    (IEnumerable<TDerived> source)
    where TDerived : TBase
{
    foreach (TDerived item in source)
    {
        yield return item;
    }
}

这样叫它:

代码语言:javascript
复制
IEnumerable<Page> pages = UtilityClass.Cast<User, Page>(users);

这将懒惰地评估它。在LINQ中它更简单--你可以使用Cast扩展方法:

代码语言:javascript
复制
var baseSequence = derivedSequence.Cast<BaseClass>();

在.NET 4中,IEnumerable<T>T中是协变的,因此已经有了从IEnumerable<DerivedClass>IEnumerable<BaseClass>的引用类型转换:)

票数 13
EN

Stack Overflow用户

发布于 2011-04-14 04:01:13

您可以这样做:

代码语言:javascript
复制
DatabaseLinkRowsEnumerator<User> users = ...
IEnumerable<Page> = users.Cast<Page>();

编辑:.NET 2.0中不提供Cast扩展方法。您可以使用Jon Skeet的实现作为常规的静态方法。如果您使用的是VS2008,您还可以使用LinqBridge,它允许您在面向.NET 2.0时使用Linq to Objects

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5654885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档