Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 铸造可计量<;派生>;到IEnumerable<;基类>;_C#_Generics_Inheritance_Casting_.net 2.0 - Fatal编程技术网

C# 铸造可计量<;派生>;到IEnumerable<;基类>;

C# 铸造可计量<;派生>;到IEnumerable<;基类>;,c#,generics,inheritance,casting,.net-2.0,C#,Generics,Inheritance,Casting,.net 2.0,我有一个类,我用它来枚举数据库中的列表。数据库中的所有表都有自己的类和属性,它们都派生自DatabaseTableRow public class DatabaseLinkRowsEnumerator<T> : IEnumerator<T>, IEnumerable<T> where T : DatabaseTableRow 我正在使用ASP.NET2.0。有没有人知道如何在不制作完整副本的情况下对其进行强制转换/转换?使用.NET 2.0,有点尴尬,但也不

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

public class DatabaseLinkRowsEnumerator<T> : IEnumerator<T>, IEnumerable<T> where T : DatabaseTableRow
我正在使用ASP.NET2.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;
    }
}
在.NET 4中,
IEnumerable
T
中是协变的,因此有一个从
IEnumerable
IEnumerable
的引用类型转换:)

您可以这样做:

DatabaseLinkRowsEnumerator<User> users = ...
IEnumerable<Page> = users.Cast<Page>();
DatabaseLinkRowsEnumerator用户=。。。
IEnumerable=users.Cast();

编辑:
Cast
扩展方法在.NET2.0中不可用。您可以将Jon Skeet的实现用作普通的静态方法。如果您使用的是VS2008,您还可以使用,它允许您在目标为.NET 2.0时使用Linq to对象。

不是可枚举的。Cast()是一个Linq方法,在.NET 3.5中引入?如果继承设置正确,这是正确的,但在OP的帖子中,我没有看到DatabaseTableRow和Page之间的关系。@Justin,OP说这个页面来自DatabaseTableRow,不过我有点困惑。。你会把这个方法放在哪里?@Connell:无论如何-比如在一个实用类中。只要从需要序列的任何地方调用它。@Connell:我忘了在方法中包含类型参数,这可能没有帮助。我已经更新了这个方法并给出了一个例子。
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);
var baseSequence = derivedSequence.Cast<BaseClass>();
DatabaseLinkRowsEnumerator<User> users = ...
IEnumerable<Page> = users.Cast<Page>();