我试图制作一个通用的方法来分页IEnuemrable<T>和IQueryable<T>
像这样:
public T Paginate<T, TS>(T list) where T : IEnumerable<TS>
{
CheckValidityAndClamp();
return (T)(list.Skip(Page*PageSize).Take(PageSize));
}
Run Code Online (Sandbox Code Playgroud)
当我通过一个List<int>实例时,它编译得很好.但是在运行时会给出一个强制转换异常:
System.InvalidCastException : An object of type '<TakeIterator>d__3a`1[System.Int32]' can not be converted to the type 'System.Collections.Generic.List`1[System.Int32]'.
Run Code Online (Sandbox Code Playgroud)
这是为什么?A List<int>实现IEnumerable<int>为什么抛出异常?
你没有回复名单. Take使用迭代器块实现,这意味着实际类型是一个没有编译时标识符的类型(这就是为什么它看起来很奇怪)并且它实现了IEnumerable.它不是一个List,你试图把它投射到.
最重要的是,您的方法实际上不适用于任何IQueryable对象.它调用Skip接受的实现IEnumerable(因为这是泛型约束告诉它必须实现的编译器)所以如果它是一个IQueryable(即使你解决了凌乱的转换问题)你也不会使用查询提供程序来转换Skip调用.你需要在这里有两个重载,一个用于IQueryable,一个用于IEnumerable; 这是相当多的内在给定的问题,有两个Skip和Take你需要调用,每个方法IEnumerable和IQueryable.