【发布时间】:2018-01-29 20:40:03
【问题描述】:
我正在尝试使用 CSVHelper 序列化由多个类构成的数据库,如下所示。我想通过添加有关单位的信息(适当时)和对数据进行排序以使“名称”始终首先出现,从而使 csv 更具人类可读性。其余的可以按任何顺序出现。
我有一个如下所示的课程。
[DataContract(IsReference = true)]
public class OpaqueMaterial : LibraryComponent
{
[DataMember]
[Units("W/m.K")]
public double Conductivity { get; set; } = 2.4;
[DataMember]
public string Roughness { get; set; } = "Rough";
}
[DataContract]
public abstract class LibraryComponent
{
[DataMember, DefaultValue("No name")]
public string Name { get; set; } = "No name";
}
为了避免为每个类编写单独的读写函数,我使用如下模板函数进行读写:
public void writeLibCSV<T>(string fp, List<T> records)
{
using (var sw = new StreamWriter(fp))
{
var csv = new CsvWriter(sw);
csv.WriteRecords(records);
}
}
public List<T> readLibCSV<T>(string fp)
{
var records = new List<T>();
using (var sr = new StreamReader(fp))
{
var csv = new CsvReader(sr);
records = csv.GetRecords<T>().ToList();
}
return records;
}
然后我在代码中使用它来读写:
writeLibCSV<OpaqueMaterial>(folderPath + @"\OpaqueMaterial.csv", lib.OpaqueMaterial.ToList());
List<OpaqueMaterial> inOpaqueMaterial = readLibCSV<OpaqueMaterial>(folderPath + @"\OpaqueMaterial.csv");
CSV 输出如下所示:
Conductivity, Roughnes, Name
2.4, Rough, No Name
我想成为:
Name, Conductivity [W/m.K], Roughness
No Name, 2.4, Rough
我知道可以使用以下地图重新排序:
public class MyClassMap : ClassMap<OpaqueMaterial>
{
public MyClassMap()
{
Map(m => m.Name).Index(0);
AutoMap();
}
}
我想把这个抽象化,这样我就不必对每个类应用不同的映射。我找不到可以帮助添加自定义标题的示例。任何建议或帮助将不胜感激。
【问题讨论】:
-
CsvHelper doesn't directly support 以这种方式使用属性。如果能够做到这一点而不是使用提供的流畅映射 API 对您来说非常重要,您可以编写自己的 CustomAttribute 类型,并编写代码使用反射来发现这些属性并根据它找到的内容映射属性。跨度>
标签: c# attributes csvhelper