CSV Helper Mapper:如何在 CSV 写入期间映射列表 属性

CSV Helper Mapper: How to map list property during CSV write

我正在尝试根据其中一个属性为列表的模型生成 CSV 文件。 因此,我的目标是指定一些属性列表并根据这些属性生成字段和值。例如,结果可以是:

Attribute:Brand Attribute:Brand Attribute:Size Attribute:Brand
Test Value1 Test Value2 Test Value3 Test Value4

我尝试使用匿名 objects 或模型 objects,但失败了。

基本上,有两个挑战:

  1. 拆分列表 属性 到字段。我看到有 Converter 方法,但它 returns string
  2. 生成 header 名称取决于指定。我看到有一个 Name 方法可以处理替代名称。

有什么idea/advise可以解决吗?使用匿名 object 或模型哪个更好?

注意:我根本不需要看。我只需要保存它。

这是您可以做到的一种方式。

void Main()
{
    var records = new List<ProductCsvModel>
    {
        new ProductCsvModel
        {
            DirectCosts = 1.1M,
            Attributes = new List<dynamic>
            {
                new { Brand = "Test1" },
                new { Season = "Test2" },
                new { Brand = "Test3" },
                new { Custom = "Test4" }
            }
        }
    };
    
    using (var csv = new CsvWriter(Console.Out, CultureInfo.InvariantCulture))
    {
        var first = records.First();
        
        csv.WriteHeader<ProductCsvModel>();
        
        foreach (var item in first.Attributes)
        {
            PropertyInfo[] properties = item.GetType().GetProperties();
            foreach (PropertyInfo property in properties)
            {
                csv.WriteField("Attribute:" + property.Name);
            }
        }
        
        csv.NextRecord();
        
        foreach (var record in records)
        {
            csv.WriteRecord(record);
            
            foreach (var item in record.Attributes)
            {
                PropertyInfo[] properties = item.GetType().GetProperties();
                foreach (PropertyInfo property in properties)
                {
                    csv.WriteField(property.GetValue(item));
                }               
            }

            csv.NextRecord();
        }
    }
}

public class ProductCsvModel
{
    public decimal DirectCosts { get; set; }
    public List<dynamic> Attributes { get; set; }
}