2009-07-01 36 views
5

IEnumerableリストをBindingListコレクションにキャストすることはできますか?IEnumerable <T>リストをバインドリスト<t>にキャストできないのはなぜですか?

IEnumerableをリストが入力されたオブジェクトなどのリストです:

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

そして、私のPagingListちょうどするBindingListを拡張:

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

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

私はちょうど出てレンダリングする方法に私のIEnumerableリストを渡したいです私のPagingControlのリスト:

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

しかし、私は間にキャストできないようです2つ、誰かが私が行方不明を指摘することができますか?

感謝

ベン

+1

あなたが実際に参照しているオブジェクトがあなたが言っているタイプであるかどうかを知るために、キャストはしばしば_check_です。この場合、別のオブジェクトを何らかの形で何らかの形に変形させようとする試みではありません。それが明確でない場合は、次の記事を参考にしてください。http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx –

答えて

4

BindingList<T>IEnumerable<T>を実装していますが、すべてのIEnumerable<T>のリストを結合されているわけではない(実際には、ほとんどはそうではありません)。

新しいBindingListを作成して、列挙可能なインスタンスにアイテムを追加できるはずです。

1

IEnumerableを実装していないRenderListingsRowsにPagingListを渡します。

一般に、PagingListをBindingListの拡張にするには、BindingListが実装するすべてのインターフェイスを実装する必要があります。しかし、現在のところ、それは実装されていません。

BindingListからPagingListを継承するか、単にCollectionオブジェクトのメソッドを呼び出すだけでこれらのインターフェイスをすべて実装する必要があります。

または、あなたは単に(list.CollectionにVAR項目)のために書くことができます

0

アカウントのコレクションがaccountInfoの>のIList <を実装している場合、あなたがこれを行うことができるようになります。

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

を送りますバインディングリストをページングリストではなくRenderListingsRowsに追加します。 PagingListはBindingListを拡張せず、代わりにcomposisionを使用します。したがって、問題です。以下

例。

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

だけ指摘して、あなたのPagingListがするBindingListを延長しない、それは、組成物を通してそれを使用しています。

私はこれに似た回答を探しました。ここでの答えは、あなたの質問に明確な解決策を提供するようには思われません。私は渡す人のために1つを追加すると思った。

だから情報が提供与えられ、簡単な答えはノーですが、あなたのクラスをリファクタリングすることなく、必要なものに簡単な解決策はこれです:

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

だから、物理的にあなたのaccountInfoの項目を追加する必要がありますBindingListインスタンスのプロパティ 'Collection'。

+1

微妙なバリエーションが私に役立ちました。ありがとう – n00dles

関連する問題