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