2011-07-04 61 views
1

我想在創建csv文件之前使用System.Reflection輸出csv文本文件的列標題信息的第一行實際的通用列表從我的數據源。如何提取類對象的System.Reflection.PropertyInfo名稱作爲csv文件的第一行

public class DocMetaData 
{ 
    public const string SEPARATOR = "\t";  // horizontal tab is delimiter 
    public string Comment { get; set; } 
    public string DocClass { get; set; } 
    public string Title { get; set; } 
    public string Folder { get; set; } 
    public string File { get; set; } 
} 

在下面的程序中,我通過對象定義的屬性試圖環和使用屬性的名稱爲「列名」我的我的輸出文件的第一行:

private void OutputColumnNamesAsFirstLine(StreamWriter writer) 
    { 
     StringBuilder md = new StringBuilder(); 
     PropertyInfo[] columns; 
     columns = typeof(DocMetaData).GetProperties(BindingFlags.Public | 
                 BindingFlags.Static); 
     foreach (var columnName in columns) 
     { 
      md.Append(columnName.Name); md.Append(DocMetaData.SEPARATOR); 
     } 
     writer.WriteLine(md.ToString()); 
    } 

foreach循環立即退出。另外,我在類中放置了一個常量分隔符,但我想將其用作字段分隔符值(而不是「列」名稱)。

我假設如果我能得到像這樣的工作,類中的屬性的序數位置將保持一致。

從我的數據源創建List<DocMetaData>的代碼的其餘部分工作,但我想添加此「第一行」的東西。

謝謝你對此的幫助。

回答

3

我想你必須做

columns = typeof(DocMetaData).GetProperties(BindingFlags.Public | 
                 BindingFlags.Instance); 

你正在努力探索的領域是instance領域不static

+0

你很棒,能幫助我。非常感謝 - 精美地工作。 –

3

請勿使用BindingFlags.Static,因爲這隻會產生靜態成員(公共靜態)。改爲使用BindingFlag.Instance,因爲您的屬性是實例成員。

+0

哇,你們是真棒。非常感謝。 –

2

您應該用BindingFlags.Instance . The properties in your替換BindingFlags.Static DocMetaData`不是靜態的。

private void OutputColumnNamesAsFirstLine(StreamWriter writer) 
{ 
    StringBuilder md = new StringBuilder(); 
    PropertyInfo[] columns; 
    columns = typeof(DocMetaData).GetProperties(BindingFlags.Public | 
                BindingFlags.Instance); 
    foreach (var columnName in columns) 
    { 
     md.Append(columnName.Name); 
     md.Append(DocMetaData.SEPARATOR); 
    } 
    writer.WriteLine(md.ToString()); 
} 
相關問題