IPagedList实现IList接口但是

时间:2012-09-06 11:38:37

标签: c# asp.net-mvc collections

我有IPagedList接口实现IList这样的

public interface IPagedList<T> : IList<T>
{
    int PageCount { get; }
    int TotalItemCount { get; }
    int PageIndex { get; }
    ...
}

现在我想使用此IPagedList来表示带分页的数据。 我正在尝试将使用IList的现有代码转换为IPagedList

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

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

public IPagedList<MyViewModel> Data
{
   get
    .... 

因为IPagedList实施了IList,我该如何解决这个问题。

3 个答案:

答案 0 :(得分:6)

IPagedList<T>实施IList<T>List<T>也实施IList<T>,这是正确的。

但这并不意味着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; 
    } 
} 

答案 1 :(得分:4)

  

所以,我想知道为什么这不能转换为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; }
}

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

答案 2 :(得分:0)

原因是myVal返回一个从IList而不是你的接口IPageList实现的列表。