我有一个类,我用它来枚举数据库中的列表。数据库中的所有表都有自己的类和自己的属性,并且它们都派生自DatabaseTableRow。
public class DatabaseLinkRowsEnumerator<T> : IEnumerator<T>, IEnumerable<T> where T : DatabaseTableRow我有一个User类,它派生自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。有没有人知道如何在不制作完整副本的情况下进行转换/转换?
发布于 2011-04-14 04:00:24
使用.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>的引用类型转换:)
发布于 2011-04-14 04:01:13
您可以这样做:
DatabaseLinkRowsEnumerator<User> users = ...
IEnumerable<Page> = users.Cast<Page>();编辑:.NET 2.0中不提供Cast扩展方法。您可以使用Jon Skeet的实现作为常规的静态方法。如果您使用的是VS2008,您还可以使用LinqBridge,它允许您在面向.NET 2.0时使用Linq to Objects
https://stackoverflow.com/questions/5654885
复制相似问题