如何提取系统.反射类对象的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>
的代码的其余部分可以工作,但我想添加"第一行"的内容。
谢谢你在这方面的帮助。
我想你必须进行
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());
}