1

在从我的数据源创建实际的通用列表之前,我正在尝试使用 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>有效,但我想添加这个“第一行”的东西。

感谢您对此的帮助。

4

3 回答 3

3

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

于 2011-07-04T20:05:44.803 回答
3

我想你必须做

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

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

于 2011-07-04T20:12:01.407 回答
2

您应该替换BindingFlags.Static为 BindingFlags.Instance . The properties in yourDocMetaData` 不是静态的。

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());
}
于 2011-07-04T20:07:33.993 回答