6

IEnumerable リストを BindingList コレクションにキャストすることは可能ですか?

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;
    }
}

PagingControl でリストをレンダリングするメソッドに IEnumerable リストを渡したかっただけです。

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

しかし、私は2つの間でキャストできないようです.誰かが私が欠けているものを指摘できますか?!

どうもありがとう

ベン

4

5 に答える 5

4

指摘しておくと、あなたの PagingList は BindingList を拡張するのではなく、コンポジションを通じて使用します。

同様の答えを探してこれに出くわしました。ここでの回答はどれも、あなたの質問に対する明確な解決策を提供しているようには見えませんが、それを理解するための貴重なポイントに言及しています. 通りすがりの人のために1つ追加すると思いました。

したがって、提供された情報を考えると、簡単な答えはノーですが、クラスをリファクタリングせずに必要なものに対する簡単な解決策は次のとおりです。

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

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

于 2016-11-08T11:14:17.593 に答える
3

BindingList<T>implementsIEnumerable<T>を実装していますが、すべてIEnumerable<T>がバインディング リストであるとは限りません (実際、ほとんどはそうではありません)。

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

于 2009-07-01T16:31:43.647 に答える
1

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

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

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

または、単純に for (var item in list.Collection) と書くこともできます

于 2009-07-01T16:34:23.537 に答える
0

ページング リストではなく、バインディング リストを RenderListingsRows に送信します。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;
            }

        }

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

            RenderListingsRows(pagingList.Collection);
        }

        protected void RenderListingsRows(BindingList<PostcodeDetail> list)
        {
            foreach (var item in list)
            {
                //render stuff
            }
        }
于 2009-07-02T11:03:08.050 に答える