Получить данные из IEnumerable? - PullRequest
0 голосов
/ 01 марта 2012

[CrossPost From MSDN]

У меня была задача, что мне нужно отправить общий список в метод, где мне нужно выполнить итерацию и преобразовать его в файл Excel. Я уже сделал это с таблицей данных, но с общим списком я столкнулся с некоторыми проблемами (я не хочу преобразовывать свой общий список в таблицу данных). Я вставлю код, который поможет мне получить ответ.

У меня было два общих списка

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

// Я добавляю какой-то элемент в список

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

Чтобы экспортировать его в Excel, я передаю списки перечисленным ниже методам как

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

        var Users = list.ToList();

        Type myType = (typeof(T));
    }

Когда я передаю свой список в Ienumerable ... Я не могу получить данные, присутствующие в списке List IEnumerable. Если я получу данные, то смогу справиться дальше. Кто-нибудь может предложить мне лучшую идею?

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Если вам нужен доступ к значениям всех свойств типа T, вы можете использовать метод PropertyInfo.GetValue:

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

Редактировать в ответ на комментарий

Вы указали, что можете получить один список или список списков. Вы можете добавить еще одну перегрузку, которая принимает составленные списки, затем выполнить итерацию по ней и экспортировать каждый отдельный список:

public void ExportToExcel<T>(IEnumerable<IEnumerable<T>> itemSets)
{
    foreach(var itemSet in itemSets)
    {
        ExportToExcel(itemSet);
    }
}
1 голос
/ 01 марта 2012

Если вы всегда собираетесь работать с List<T>, вы можете изменить IEnumerable<T> на IList<T>.AFAIK Интерфейс IEnumerable не определяет методы доступа к данным внутри коллекции, только для их итерации.

Вы даже можете использовать ICollection<T>, если это соответствует вашим потребностям.

...