Dire che ho la seguente interfaccia per esporre un elenco di pagingmodello per esporre versione non generica di un'interfaccia generica
public interface IPagedList<T>
{
IEnumerable<T> PageResults { get; }
int CurrentPageIndex { get; }
int TotalRecordCount { get; }
int TotalPageCount { get; }
int PageSize { get; }
}
Ora voglio creare un controllo di paging
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);
}
}
Il controllo di paging ha nessun interesse in T
(i contenuti effettivi della lista). Richiede solo il numero di pagine, la pagina corrente ecc. Quindi l'unico motivo per cui lo PagedListPager
è generico è che verrà compilato con il parametro generico IPagedList<T>
.
È un codice olfattivo? Dovrei preoccuparmi di avere effettivamente un ridondante generico?
C'è un modello standard in un caso come questo per esporre una versione non generica dell'interfaccia, quindi posso rimuovere il tipo generico sul cercapersone?
public class PagedListPager(IPagedList list)
Modifica
ho pensato di aggiungere anche l'attuale modo ho risolto questo problema e invito i commenti che si tratti di una soluzione adatta:
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
}
Ora posso passare a ConcretePagedList<T>
a classi/funzioni non generiche
'PagedListPager' una dichiarazione di classe o metodo? –
@Gregg oops scusate lo modifico. – fearofawhackplanet
Non mi piace avere le proprietà definite in entrambe le interfacce, poiché è possibile implementarle esplicitamente per fare cose diverse. Ad esempio, IPagedList.PageSize {get {return 8;}} IPageList .PageSize {get {return this.PageResults.Count();}} L'unica ragione per cui hai la seconda interfaccia è quella di fornire una digitazione forte, quindi la risposta di Marc sembra rimuovere la possibilità per la classe di avere risultati diversi sulle proprietà che non dovrebbero essere diverse. –
MPavlak