Допустим, у меня есть следующий интерфейс для отображения списка страниц
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>
неуниверсальным классам / функциям