IPagedList实现IList接口但是

pan*_*njo 1 c# collections asp.net-mvc

我有IPagedList接口,实现IList这样的

public interface IPagedList<T> : IList<T>
{
    int PageCount { get; }
    int TotalItemCount { get; }
    int PageIndex { get; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在我想用它IPagedList来表示分页数据.我试图转换这是使用现有的代码IListIPagedList

public IList<MyViewModel> Data
{
  get
  {         
    List<MyViewModel> myVal = new List<MyViewModel>();
    foreach (MyModel m in data)
    {
       myVal.Add(new MyViewModel(m));
    }
    return myVal;
  }
}
Run Code Online (Sandbox Code Playgroud)

所以,我想知道为什么这不能转换成

public IPagedList<MyViewModel> Data
{
   get
    .... 
Run Code Online (Sandbox Code Playgroud)

导致IPagedList工具IList,我该如何解决这个问题.

Dan*_*rth 7

IPagedList<T>实现IList<T>List<T>实现IList<T>,这是正确的.

但这并不意味着a List<T>可以转换为IPagedList<T>.这仍然是两种不同的类型.想一想:保时捷是一辆汽车,标致是一辆汽车,但它们仍然不能互换.

您需要具有该IPagedList<T>接口的具体实现.如果您有,可以使用以下代码:

public IList<MyViewModel> Data 
{ 
    get 
    { 
        var myVal = new PagedList<MyViewModel>(); 
        foreach (MyModel m in data) 
        { 
            myVal.Add(new MyViewModel(m)); 
        } 
        return myVal; 
    } 
} 
Run Code Online (Sandbox Code Playgroud)


jga*_*fin 5

所以,我想知道为什么这不能转换为 public IPagedList Data { get

您不能再使用List<T>,因为它没有实现您的接口。您已经创建了自己的类来实现IPagedList<T>.

更重要的问题是您有一个Data返回分页列表的属性。如何处理分页并不明显。

第一个虽然它在枚举列表时延迟加载每个页面。但事实并非如此?您可能想重新考虑您的设计。

我会改为使用组合创建一个新界面:

interface IPagedResult<T>
{
    int PageCount { get; }
    int TotalItemCount { get; }
    int PageIndex { get; }
    IEnumerable<T> Page {get; }
}
Run Code Online (Sandbox Code Playgroud)

更明显的是返回单个页面,您不必创建自己的列表类。