2010-11-12 8 views
1

У меня есть проект, который создает файлы Excel, и я хотел бы добавить некоторые функции импорта. В двух словах я хотел бы дать пользователям возможность закодировать следующим образом:Как импортировать/разбирать данные коллекции?

worksheet.Cell(1, 1).Value = collectionObject;

(где collectionObject реализует IEnumerable)

Как я могу разобрать IEnumerable любого типа и извлекать значения свойства и поля каждого элемента?

Это моя неудачная попытка:

class Program 
{ 
    static void Main(string[] args) 
    { 
     // It fails with a list of strings 
     var listOfStrings = new List<String>(); 
     listOfStrings.Add("House"); 
     listOfStrings.Add("Car"); 
     new ParseCollections().ParseCollection(listOfStrings, 1, 1); 
     // Get error "Parameter count mismatch." when calling info.GetValue(m, null).ToString() 
     // The property is an array "Chars". 
     // I tried filtering the property with "info as IEnumerable == null" but it doesn't catch it. 
     // How can I filter collection properties here? 


     // It works with a list of POCO 
     var listOfPOCO = new List<Person>(); 
     listOfPOCO.Add(new Person() { Name = "John", Age = 30 }); 
     listOfPOCO.Add(new Person() { Name = "Jane", Age = 25 }); 
     new ParseCollections().ParseCollection(listOfPOCO, 1, 1); 
    } 

    class Person 
    { 
     public String Name { get; set; } 
     public Int32 Age { get; set; } 
    } 
} 
class ParseCollections 
{ 
    public void ParseCollection(Object collectionObject, Int32 initialRow, Int32 initialColumn) 
    { 
     var asEnumerable = collectionObject as IEnumerable; 
     if (asEnumerable != null) 
     { 
      var ro = initialRow; 
      foreach (var m in asEnumerable) 
      { 
       var co = initialColumn; 
       var fieldInfo = m.GetType().GetFields(); 
       foreach (var info in fieldInfo) 
       { 
        Console.WriteLine("Cell({0}, {1}) = {2}", ro, co, info.GetValue(m).ToString()); 
        co++; 
       } 
       var propertyInfo = m.GetType().GetProperties(); 
       foreach (var info in propertyInfo) 
       { 
        Console.WriteLine("Cell({0}, {1}) = {2}", ro, co, info.GetValue(m, null).ToString()); 
        co++; 
       } 
       ro++; 
      } 
     } 
    } 
} 
+0

Когда вы говорите «не удалось» - что происходит? –

+0

Я немного изменил этот пример, чтобы сделать его более ясным. Он работает со списком объектов POCO, но он терпит неудачу со списком строк. Как я могу заставить его работать с список String, Int32 и т. д.? – Manuel

ответ

0

Следующая разбирает IEnumerable объект, но, кажется, способ надуманными и просто просить пользователя, чтобы передать IEnumerable, который будет нарушать функцию :(

 public void ParseCollection(Object collectionObject, Int32 initialRow, Int32 initialColumn) 
    { 
     var asEnumerable = collectionObject as IEnumerable; 
     if (asEnumerable != null) 
     { 
      var ro = initialRow; 
      foreach (var m in asEnumerable) 
      { 
       var co = initialColumn; 

       if (m.GetType().IsPrimitive || m.GetType() == typeof(String) || m.GetType() == typeof(DateTime)) 
       { 
        SetValue(m, ro, co); 
       } 
       else if (m.GetType().IsArray) 
       { 
        dynamic arr = m; 
        foreach(var item in arr) 
        { 
         SetValue(item, ro, co); 
         co++; 
        } 
       } 
       else if ((m as DataRow) != null) 
       { 
        foreach (var item in (m as DataRow).ItemArray) 
        { 
         SetValue(item, ro, co); 
         co++; 
        } 
       } 
       else 
       { 
        var fieldInfo = m.GetType().GetFields(); 
        foreach (var info in fieldInfo) 
        { 
         SetValue(info.GetValue(m), ro, co); 
         co++; 
        } 
        var propertyInfo = m.GetType().GetProperties(); 
        foreach (var info in propertyInfo) 
        { 
         if ((info as IEnumerable) == null) 
          SetValue(info.GetValue(m, null), ro, co); 
         co++; 
        } 
       } 
       ro++; 
      } 
     } 
    } 
    private static void SetValue(object objWithValue, int ro, int co) 
    { 
     String str = String.Empty; 
     if (objWithValue != null) 
      str = objWithValue.ToString(); 

     Console.WriteLine("Cell({0}, {1}) = {2}", ro, co, str); 
    } 
Смежные вопросы