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");
    }
}