在我从数据源创建实际通用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>
的代码的其余部分可以工作,但我想添加这个“第一行”的东西。
感谢您的帮助。
答案 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());
}