Bhuvan
Bhuvan

Reputation: 419

Retrieve Data From IEnumerable?

[CrossPost From MSDN]

I had a task that, I need to send a generic List to a method, where I need to iterate it and convert it to an Excel File. I already did this with Data Table, but with Generic list I am facing some problems (I don't want to convert my generic list to Data Table). I will paste the code which helps me out for an answer.

I Had Two Generic Lists

            List<User>       objList = new List<User>();
            List<Student> objStudent = new List<Student>();

// I am adding some Item to List

            User obj = new User(1, "aaa");
            User obj1 = new User(2, "bbb");
            User obj2 = new User(3, "ccc");
            User obj3 = new User(4, "ddd");


            Student sobj = new Student(1, "aaa");
            Student sobj1 = new Student(2, "bbb");
            Student sobj2 = new Student(3, "ccc");
            Student sobj3 = new Student(4, "ddd");
            objList.Add(obj);ExportToExcel(objList);

To Export it to Excel , I am passing the lists to the below methods as

    public void ExportToExcel<T>(IEnumerable<T> list)
    {
        PropertyInfo[] piT = typeof(T).GetProperties();

        var Users = list.ToList();

        Type myType = (typeof(T));
    }

When I am passing my list to Ienumerable... I am not able to retrieve the data present in the List IEnumerable list. If I retrieve the data , then I can handle further. Could any one suggest me the better Idea?

Upvotes: 0

Views: 8091

Answers (2)

Bryan Watts
Bryan Watts

Reputation: 45475

If you need to access the values of all the properties on type T, you can use the PropertyInfo.GetValue method:

public void ExportToExcel<T>(IEnumerable<T> items)
{
    var properties = typeof(T).GetProperties();

    foreach(var item in items)
    {
        foreach(var property in properties)
        {
            var value = property.GetValue(item, null);

            // Do something else with the property's value
        }
    }
}

Edit in response to comment

You indicated you might receive a single list or a list of lists. You can add another overload which takes the composed lists, then iterate through it and export each individual list:

public void ExportToExcel<T>(IEnumerable<IEnumerable<T>> itemSets)
{
    foreach(var itemSet in itemSets)
    {
        ExportToExcel(itemSet);
    }
}

Upvotes: 1

PedroC88
PedroC88

Reputation: 3839

If your always going to work with List<T> you could change IEnumerable<T> to IList<T>. AFAIK the IEnumerable interface does not define methods for accessing the data inside the collection, only to iterate it.

You could even use ICollection<T> if it suits your needs.

Upvotes: 2

Related Questions