2009-12-02 169 views
4

我試圖創建一個接受通用List<T>的函數並迭代返回excel文件byte[]的列表。該功能需要能夠確定對象的屬性。所以如果我通過List<person>和人有屬性的第一,最後,年齡等我需要能夠確定屬性名稱,以創建Excel列標題,然後我需要迭代列表分配屬性值的列單元格。任何人都可以指向我的示例代碼與List<T>在通用函數中使用?幫助將泛型列表<T>轉換爲Excel電子表格

回答

9

另外:用於按已知順序恢復列:沒有爲成員定義的順序,除了您創建的順序。例如(from MSDN):

GetProperties方法不會以特定順序(例如字母或聲明順序)返回屬性。您的代碼不得依賴於返回屬性的順序,因爲順序會有所不同。

如果您不需要依賴訂單,無論是反射或TypeDescriptor會做;例如(注意,這寫TSV文本,而不是byte[] - 我的解釋是,這個問題是獲得數據,而不是寫了Excel):

static void WriteTsv<T>(this IEnumerable<T> data, TextWriter output) 
{ 
    PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T)); 
    foreach (PropertyDescriptor prop in props) 
    { 
     output.Write(prop.DisplayName); // header 
     output.Write("\t"); 
    } 
    output.WriteLine(); 
    foreach (T item in data) 
    { 
     foreach (PropertyDescriptor prop in props) 
     { 
      output.Write(prop.Converter.ConvertToString(
       prop.GetValue(item))); 
      output.Write("\t"); 
     } 
     output.WriteLine(); 
    } 
} 

如果需要順序,你會需要:

  • 傳中(例如,作爲一個params string[] propertyNames
  • 使用上的屬性的屬性
  • 使用字母

以上TypeDescriptor方法具有以下優點:(超過GetType().GetProperties())認爲:

  • 它與自定義對象模型(DataView,例如,如果你使用IList
  • 你可以調整的實施性能 - 例如HyperDescriptor(如果您正在拍攝這張照片很有用)
+0

我認爲凱文是指「...屬性名稱,以創建...」是「...屬性名,所以我可以創造... ...」,而不是一個排序列表物業名稱:) – 2009-12-02 07:02:38

+0

D'oh!我感覺很慢......我會把它保持原樣,因爲我認爲如果你期望每次都有相同的結果,這仍然是一個有趣的觀點。謝謝。 – 2009-12-02 07:03:29

+0

+1良好且完整的答案。 – eglasius 2009-12-02 07:06:46

0

使用集合支持的接口,如IEnumerable

public byte[] Process(IEnumerable input) { 
    foreach (var elem in input) { 
     foreach (PropertyInfo prop in elem.GetType().GetProperties()) { 
      Object value = prop.GetValue(elem, null); 
      // add value to byte[] 
     } 
    } 
    return bytes; 
}