Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can i not cast an IEnumerable<T> list to a BindingList<t>?

Is it possible to cast an IEnumerable list to a BindingList collection?

The IEnumerable list is a list of typed objects e.g:

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

And my PagingList just extends BindingList:

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

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

I just wanted to pass my IEnumerable list to a method that renders out the list with my PagingControl:

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

But it seems i cannot cast between the two, can anyone point out what i'm missing?!

Many thanks

Ben

like image 731
Ben Dykes Avatar asked Jul 01 '09 16:07

Ben Dykes


People also ask

Can you cast IEnumerable to list?

In C#, an IEnumerable can be converted to a List through the following lines of code: IEnumerable enumerable = Enumerable. Range(1, 300); List asList = enumerable. ToList();

How do I get IEnumerable to a list?

Use the ToList() Method to Convert an IEnumerable to a List in C# Enumerable. ToList(source); The method ToList() has one parameter only.

Is IEnumerable readonly?

The IReadOnlyCollection interface extends the IEnumerable interface and represents a basic read-only collection interface.

Can you add to IEnumerable C#?

You cannot, because IEnumerable<T> does not necessarily represent a collection to which items can be added. In fact, it does not necessarily represent a collection at all! For example: IEnumerable<string> ReadLines() { string s; do { s = Console.


3 Answers

Just to point out, your PagingList does not extend BindingList, it uses it through composition.

I came across this looking for a similar answer. None of the answers here seem to provide a clear solution to your question, although they mentioned valuable points in figuring it out. I thought I'd add one for anyone passing by.

So given the information provided, the simple answer is no, but a simple solution to what you need without refactoring your classes is this:

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

So you'll have to physically add your AccountInfo items to your BindingList instance property 'Collection'.

like image 136
Vort3x Avatar answered Oct 12 '22 14:10

Vort3x


BindingList<T> implements IEnumerable<T>, but not all IEnumerable<T> are binding lists (in fact, most aren't).

You should be able to create a new BindingList and add the items in the enumerable instance.

like image 28
Lucero Avatar answered Oct 12 '22 16:10

Lucero


You pass PagingList into your RenderListingsRows, which does not implement IEnumerable.

In general, for PagingList to be an extension over BindingList it has to implement all interfaces that BindingList implements. But currently it does not implement any of them.

You should either inherit PagingList from BindingList, or implement all these interfaces, even if simply by calling methods of Collection object.

Or, you can just simply write for (var item in list.Collection)

like image 1
Maxim Alexeyev Avatar answered Oct 12 '22 15:10

Maxim Alexeyev