Как извлечь имена System.Reflection.PropertyInfo объекта класса в качестве первой строки файла CSV - PullRequest
1 голос
/ 05 июля 2011

Я пытаюсь использовать 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 ]

3 голосов
/ 05 июля 2011

Полагаю, вам нужно сделать

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

Поля, которые вы пытаетесь найти, instance поля, а не static

3 голосов
/ 05 июля 2011

Не используйте BindingFlags.Static, потому что это дает только статические члены (public static). Вместо этого используйте BindingFlag.Instance, поскольку ваши свойства являются членами экземпляра.

2 голосов
/ 05 июля 2011

Вы должны заменить BindingFlags.Static на BindingFlags.Instance . 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());
}
...