我有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
,我该如何解决这个问题。
答案 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实现的列表。