CsvHelper 创建一个包含 属性 的 ClassMap<ClassA> 作为列表项写入 csv 文件
CsvHelper create a ClassMap<ClassA> that contains a property as List Items to writes to csv file
有一些 classes:
Class A
{
public ClassC PropertyC {get;set; }
public List<ClassB> PropertyBs { get;set; }
}
Class B { public ClassE PropertyE {get;set; } }
Class C { public ClassD PropertyD {get;set; } }
已创建:
稍后在某些基础设施中使列初始化的包装器 class,在 ctor
中不正确
public abstract class WrapMap<T>: ClassMap<T>
{
public virtual void Configure(List<CsvColumnDefinition> columns) { }
}
public sealed class ClassAMap: WrapMap<ClassA>
{
public override void Configure(List<CsvColumnDefinition> columns)
{
var column = columns.FirstOrDefault.....
Map(m => m.PropertyC.PropertyD).MapColumn(column); // -- works fine ! MapColumn just do index and hide/show
Map(m = m.PropertyBs) ???? what should be here Reference ?
}
}
是否可以在不创建额外的 class 的情况下为 PropertyBs 映射创建一个映射?我为 PropertyBs 创建了一个 ClassBMap 并尝试使用 Reference(m => m.PropertyBs) ,但似乎没有任何帮助。
我希望看到如下结果:
ClassC, ClassB.ClassE, ClassB.ClassD
L , N , H
L , G , J
S , Y , T
这可能接近您要找的内容。我不相信有任何方法可以通过单个 ClassMap
来做你想做的事
public class Program
{
public static void Main(string[] args)
{
var records = new List<ClassA>
{
new ClassA {
PropertyC = new ClassC { Id = "L" },
PropertyBs = new List<ClassB> {
new ClassB {
PropertyD = "N",
PropertyE = "H" },
new ClassB {
PropertyD = "G",
PropertyE = "J"}
}
},
new ClassA {
PropertyC = new ClassC { Id = "S" },
PropertyBs = new List<ClassB> {
new ClassB {
PropertyD = "Y",
PropertyE = "T" }
}
}
};
using (var csv = new CsvWriter(Console.Out))
{
csv.Configuration.RegisterClassMap<ClassBMap>();
csv.Configuration.RegisterClassMap<ClassCMap>();
csv.WriteHeader<ClassC>();
csv.WriteHeader<ClassB>();
csv.NextRecord();
foreach (var record in records)
{
foreach (var item in record.PropertyBs)
{
csv.WriteRecord(record);
csv.WriteRecord(item);
csv.NextRecord();
}
}
}
Console.ReadKey();
}
}
public class ClassA
{
public ClassC PropertyC { get; set; }
public List<ClassB> PropertyBs { get; set; }
}
public class ClassB {
public string PropertyD { get; set; }
public string PropertyE { get; set; }
}
public class ClassC {
public string Id { get; set; }
}
public class ClassCMap : ClassMap<ClassC>
{
ClassCMap()
{
Map(m => m.Id).Name("ClassC");
}
}
public class ClassBMap : ClassMap<ClassB>
{
ClassBMap()
{
Map(m => m.PropertyD).Name("ClassB.PropertyD");
Map(m => m.PropertyE).Name("ClassB.PropertyE");
}
}
有一些 classes:
Class A
{
public ClassC PropertyC {get;set; }
public List<ClassB> PropertyBs { get;set; }
}
Class B { public ClassE PropertyE {get;set; } }
Class C { public ClassD PropertyD {get;set; } }
已创建:
稍后在某些基础设施中使列初始化的包装器 class,在 ctor
中不正确public abstract class WrapMap<T>: ClassMap<T>
{
public virtual void Configure(List<CsvColumnDefinition> columns) { }
}
public sealed class ClassAMap: WrapMap<ClassA>
{
public override void Configure(List<CsvColumnDefinition> columns)
{
var column = columns.FirstOrDefault.....
Map(m => m.PropertyC.PropertyD).MapColumn(column); // -- works fine ! MapColumn just do index and hide/show
Map(m = m.PropertyBs) ???? what should be here Reference ?
}
}
是否可以在不创建额外的 class 的情况下为 PropertyBs 映射创建一个映射?我为 PropertyBs 创建了一个 ClassBMap 并尝试使用 Reference(m => m.PropertyBs) ,但似乎没有任何帮助。
我希望看到如下结果:
ClassC, ClassB.ClassE, ClassB.ClassD
L , N , H
L , G , J
S , Y , T
这可能接近您要找的内容。我不相信有任何方法可以通过单个 ClassMap
public class Program
{
public static void Main(string[] args)
{
var records = new List<ClassA>
{
new ClassA {
PropertyC = new ClassC { Id = "L" },
PropertyBs = new List<ClassB> {
new ClassB {
PropertyD = "N",
PropertyE = "H" },
new ClassB {
PropertyD = "G",
PropertyE = "J"}
}
},
new ClassA {
PropertyC = new ClassC { Id = "S" },
PropertyBs = new List<ClassB> {
new ClassB {
PropertyD = "Y",
PropertyE = "T" }
}
}
};
using (var csv = new CsvWriter(Console.Out))
{
csv.Configuration.RegisterClassMap<ClassBMap>();
csv.Configuration.RegisterClassMap<ClassCMap>();
csv.WriteHeader<ClassC>();
csv.WriteHeader<ClassB>();
csv.NextRecord();
foreach (var record in records)
{
foreach (var item in record.PropertyBs)
{
csv.WriteRecord(record);
csv.WriteRecord(item);
csv.NextRecord();
}
}
}
Console.ReadKey();
}
}
public class ClassA
{
public ClassC PropertyC { get; set; }
public List<ClassB> PropertyBs { get; set; }
}
public class ClassB {
public string PropertyD { get; set; }
public string PropertyE { get; set; }
}
public class ClassC {
public string Id { get; set; }
}
public class ClassCMap : ClassMap<ClassC>
{
ClassCMap()
{
Map(m => m.Id).Name("ClassC");
}
}
public class ClassBMap : ClassMap<ClassB>
{
ClassBMap()
{
Map(m => m.PropertyD).Name("ClassB.PropertyD");
Map(m => m.PropertyE).Name("ClassB.PropertyE");
}
}