2012-03-01 3 views
0

[CrossPost From MSDN]Извлечь данные из IEnumerable?

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

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

  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 ... Я не могу получить данные, представленные в списке IEnumerable список. Если я получу данные, тогда я смогу справиться дальше. Может ли кто-нибудь предложить мне лучшую идею?

ответ

1

Если вам необходимо получить доступ к значениям всех свойств по типу 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); 
    } 
} 
+0

Привет, Брайан Спасибо за ответ. Но мало сомневаюсь, что если я получу свою ценность в {{var value = property.GetValue (item, null)}} в качестве общего списка, как это сделать? Мне это не удалось? не могли бы вы помочь мне в этом? – Bhuvan

+0

@Bhuvan: 'значение' будет набираться как' object', поэтому, если вам нужен более конкретный тип, вам придется его бросить. Трудно дать вам руководство без более конкретного примера; можете ли вы предоставить более подробную информацию о том, что вы пытаетесь сделать? –

+0

: - Из BL я могу получить любой тип списка для моего метода, поэтому я могу получить один список (для этого вы предоставили образец фрагмента). или родительский список, содержащий ALL Child Lists. Но проблема связана со списком в списке, и я не могу использовать и перебирать термины в дочернем списке. Как значение Тип OBJECT, поэтому в DAL я могу не знать Тип сущности, потому что я получаю свой список как IEnumerable . Поэтому мне нужна информация о том, как мы перебираем дочерние списки, если у нас есть выбор – Bhuvan

1

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

Вы можете использовать ICollection<T>, если это вам подходит.

+0

'IList' не может, но' 'IList конечно, делает. Кроме того, если OP не нуждается в _add_ данных в их коллекции, 'IEnumerable ' должен быть более чем достаточным и до тех пор, пока исходный источник данных кодируется для его обработки, он поддерживает ленивую загрузку данных. Это может сделать мир различий в производительности. OP кажется немного туманным, хотя я не могу сказать, пытаются ли они прочитать объект из коллекции или свойство объекта _in_ в коллекции. –

+0

Я проигнорировал , думая, что это не вызовет путаницы, поэтому я просто положил его. Что касается исполнительной части, я бы хотел получить еще одно объяснение :) – PedroC88

+0

Не стесняйтесь задавать вопрос (хотя он скорее всего будет закрыт как обман;)). –