如何提取系统.反射类对象的PropertyInfo名称作为csv文件的第一行

本文关键字:csv 文件 一行 系统 何提取 提取 反射 PropertyInfo 对象 | 更新日期: 2023-09-27 18:01:13

我正在尝试使用System。反射,在我从数据源创建实际的通用列表之前,输出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>的代码的其余部分可以工作,但我想添加"第一行"的内容。

谢谢你在这方面的帮助。

如何提取系统.反射类对象的PropertyInfo名称作为csv文件的第一行

我想你必须进行

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

您尝试搜索的字段是instance字段,而不是static

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

您应该用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());
}