2009-07-01 13 views
5

È possibile eseguire il cast di un elenco IEnumerable in una raccolta BindingList?Perché non posso trasmettere un elenco IEnumerable <T> a BindingList <t>?

La lista IEnumerable è un elenco di oggetti tipizzati ad esempio:

IEnumerable<AccountInfo> accounts = bll.GetAccounts(u.UserName, u.Password); 

E il mio PagingList solo estende BindingList:

public class PagingList<T> 
{ 
    public BindingList<T> Collection { get; set; } 
    public int Count { get; set; } 

    public PagingList() 
    { 
     Collection = new BindingList<T>(); 
     Count = 0; 
    } 
} 

Volevo solo passare la mia lista IEnumerable a un metodo che rende fuori l'elenco con il mio PagingControl:

protected void RenderListingsRows(PagingList<AccountInfo> list) 
    { 
    foreach (var item in list) 
    { 
     //render stuff 
    } 
    } 

Ma sembra che non possa essere lanciato tra due, qualcuno può far notare cosa mi manca ?!

Molte grazie

Ben

+1

Ricorda, un cast è spesso solo un _check_ per vedere se l'oggetto a cui ti stai riferendo è realmente il tipo che stai dicendo che è. In questo caso non è un tentativo di trasformare in qualche modo un oggetto diverso in una forma che non ha già. Se questo non è chiaro, questo articolo potrebbe aiutare: http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx –

risposta

4

BindingList<T> implementa IEnumerable<T>, ma non tutti IEnumerable<T> sono liste vincolanti (in realtà, la maggior parte non lo sono).

Dovresti essere in grado di creare un nuovo BindingList e aggiungere gli elementi nell'istanza enumerabile.

1

Si passa a PagingList nei RenderListingsRows, che non implementano IEnumerable.

In generale, affinché PagingList sia un'estensione su BindingList, deve implementare tutte le interfacce implementate da BindingList. Ma al momento non ne implementa nessuno.

È necessario ereditare PagingList da BindingList o implementare tutte queste interfacce, anche se semplicemente chiamando i metodi dell'oggetto Collection.

In alternativa, si può semplicemente scrivere per (voce Var in list.Collection)

0

Se gli account di raccolta implementa IList <AccountInfo> si dovrebbe essere in grado di fare questo:

PagedList<AccountInfo> paged = new PagedList<AccountInfo>(); 
paged.Collection = new BindingList<AccountInfo>((IList<AccountInfo>)accounts); 
0

Inviare il lista vincolante per RenderListingsRows non nell'elenco di paging. PagingList non estende BindingList ma usa composision. Da qui il problema.

Esempio di seguito.

public class PagingList<T> 
     { 
      public BindingList<T> Collection { get; set; } 
      public int Count { get; set; } 

      public PagingList() 
      { 
       Collection = new BindingList<T>(); 
       Count = 0; 
      } 

     } 

     public void CallRenderListingsRows() 
     { 
      var pagingList = new PagingList<PostcodeDetail>(); 

      RenderListingsRows(pagingList.Collection); 
     } 

     protected void RenderListingsRows(BindingList<PostcodeDetail> list) 
     { 
      foreach (var item in list) 
      { 
       //render stuff 
      } 
     } 
1

Giusto per sottolineare, il tuo elenco di paging non estende BindingList, lo utilizza attraverso la composizione.

Mi sono imbattuto in questo aspetto per una risposta simile. Nessuna delle risposte qui sembra fornire una soluzione chiara alla tua domanda, anche se hanno menzionato punti preziosi nella sua comprensione. Ho pensato di aggiungerne uno per tutti quelli che passavano.

Quindi, dato le informazioni fornite, la semplice risposta è no, ma una semplice soluzione a quello che ti serve senza refactoring vostre classi è questo:

IEnumerable<AccountInfo> accounts= bll.GetAccounts(u.UserName, u.Password); 
myPagingList.Collection = new BindingList<Foo>(myfoos.ToList()); 

Quindi dovrete aggiungere fisicamente i tuoi articoli AccountInfo a la tua proprietà di istanza BindingList 'Collection'.

+1

Per me ha funzionato una leggera variazione. Grazie – n00dles

Problemi correlati