1

我有这样IPagedList实现的接口IList

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

现在我想用它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;
  }
}

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

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

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

4

3 回答 3

8

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

但这并不意味着 aList<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; 
    } 
} 
于 2012-09-06T11:42:43.873 回答
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; }
}

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

于 2012-09-06T11:42:31.507 回答
0

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

于 2012-09-06T11:44:35.387 回答