Скажем, у меня есть следующий интерфейс для отображения страничного списка
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
.
Is это запах кода? Должен ли я заботиться о том, чтобы у меня действительно был избыточный универсальный?
Есть ли в таком случае стандартный шаблон для раскрытия дополнительной неуниверсальной версии интерфейса, чтобы я мог удалить универсальный тип на пейджере?
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
не- общие классы / функции