如何提取类对象的System.Reflection.PropertyInfo名称作为csv文件的第一行

时间:2011-07-04 20:00:25

标签: c# .net reflection getproperties

在我从数据源创建实际通用List之前,我正在尝试使用System.Reflection输出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 个答案:

答案 0 :(得分:3)

不要使用BindingFlags.Static,因为它只产生静态成员(公共静态)。请改用BindingFlag.Instance,因为您的属性是实例成员。

答案 1 :(得分:3)

我想你必须这样做

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

您要搜索的字段为instance字段,而不是static

答案 2 :(得分:2)

你应该用BindingFlags替换BindingFlags.Static。实例. The properties in your 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());
}