ページリストを公開するための次のインターフェースがあるとします
public interface IPagedList<T>
{
IEnumerable<T> PageResults { get; }
int CurrentPageIndex { get; }
int TotalRecordCount { get; }
int TotalPageCount { get; }
int PageSize { get; }
}
今、ページング コントロールを作成したい
public class PagedListPager<T>
{
public PagedListPager<T>(IPagedList<T> list)
{
_list = list;
}
public void RenderPager()
{
for (int i = 1; i < list.TotalPageCount; i++)
RenderLink(i);
}
}
ページング コントロールはT
(リストの実際の内容) には関心がありません。ページ数、現在のページなどのみが必要です。したがって、ジェネリックである唯一の理由PagedListPager
は、ジェネリックIPagedList<T>
パラメーターでコンパイルされるためです。
これはコードの匂いですか?冗長なジェネリックを効果的に持っていることに注意する必要がありますか?
このような場合に、ページャーでジェネリック型を削除できるように、追加の非ジェネリック バージョンのインターフェイスを公開するための標準パターンはありますか?
public class PagedListPager(IPagedList list)
編集
この問題を解決した現在の方法も追加し、それが適切な解決策であるかどうかについてコメントを求めたいと思いました。
public interface IPagedList // non-generic version
{
IEnumerable<object> PageResults { get; }
int CurrentPageIndex { get; }
int TotalRecordCount { get; }
int TotalPageCount { get; }
int PageSize { get; }
}
public class ConcretePagedList<T> : IPagedList<T>, IPagedList
{
#region IPagedList<T> Members
public IEnumerable<T> PageResults { get; set; }
public int CurrentPageIndex { get; set; }
public int TotalRecordCount { get; set; }
public int PageSize { get; set; }
#endregion
#region IPagedList Members
IEnumerable<object> IPagedList.PageResults
{
get { return PageResults.Cast<object>(); }
}
#endregion
}
ConcretePagedList<T>
これで、非ジェネリック クラス/関数に渡すことができます