我有一个类,用于从我的数据库中枚举列表。数据库中的所有表都有自己的类和自己的属性,并且它们都派生自 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/