c# - 将 IEnumerable<Derived> 转换为 IEnumerable<BaseClass>

标签 c# generics inheritance casting .net-2.0

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

public class DatabaseLinkRowsEnumerator<T> : IEnumerator<T>, IEnumerable<T> where T : DatabaseTableRow

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

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

protected string GetVerticalListModuleHtml(IEnumerable<Page> pages)

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

Unable to cast object of type 'Database.DatabaseLinkRowsEnumerator`1[Database.User]' to type 'System.Collections.Generic.IEnumerable`1[Database.Page]'.

我正在使用 ASP.NET 2.0。有没有人知道如何在不制作每个副本的情况下转换/转换它?

最佳答案

使用 .NET 2.0,它有点笨拙,但不太难:

public static IEnumerable<TBase> Cast<TDerived, TBase>
    (IEnumerable<TDerived> source)
    where TDerived : TBase
{
    foreach (TDerived item in source)
    {
        yield return item;
    }
}

这样调用它:

IEnumerable<Page> pages = UtilityClass.Cast<User, Page>(users);

这将延迟评估它。在 LINQ 中它更容易 - 你使用 Cast扩展方法:

var baseSequence = derivedSequence.Cast<BaseClass>();

在 .NET 4 中,IEnumerable<T>T 中是协变的所以有一个来自 IEnumerable<DerivedClass> 的引用类型转换至 IEnumerable<BaseClass>已经:)

关于c# - 将 IEnumerable<Derived> 转换为 IEnumerable<BaseClass>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5654885/

相关文章:

c# - 如何将 Ninject 与 WebApi 一起使用?

go - 有没有一种方法可以使用泛型确保传递的值具有某些字段?

Python:派生类在同一内存位置访问基类的字典

PHP:使用同名方法处理特征

java - 当 Java 编译器看到关键字 extends 时会做什么?

c# - 使用 Linq 将 foreach IEnumerable<string> 分配给 Object.StringId

c# - 如何从请求中获取客户端域名

c# - Web API + Azure App Insights 将数据从 ActionFilter 传递到 ITelemetryProcessor

java - 实例化一个类的对象,该类是通过泛型给出的

java - 通用方法无法编译