C# CSVhelper 无法使用自定义映射写入

C# CSVhelper unable to write using a custom mapping

我最近从 CSVHelper 版本 16.0.0 转移到了 27.2.1。在我看来,对于 CSV 编写器来说,映射丢失了,因为它们现在包含在 CSVContext 中,而不是 CSVConfiguration 中。

我想使用自定义映射而不是自动生成的映射来写入 CSV,现在有办法做到这一点吗?

using (StreamWriter _stream = new StreamWriter(_fileLocation))
{
  using (CsvWriter _csvWriter = new CsvWriter(_stream, CsvContext.Configuration))
  {
      _csvWriter.WriteRecords(items);
      _csvWriter.Flush();
  }
}

我添加了代码作为上下文,你可以看到 CSVWriter 只接受不再包含映射的配置,所以当我检查 CSVWriter 的上下文时,有没有映射。如果我检查 CSVContext 本身,我会看到一个映射,这是我之前制作的自定义映射。

示例:

public class Foo
{
    public Guid id {get;set;}   
    public string name {get;set;}
    public DateTime created {get;set;}
}

所以假设我有上面的 class Foo 并且我使用工厂创建了一个自定义 class 映射所以:

private static ClassMap CreateMap()
{
    Factory _factory = new Factory();
            
    IHasMap<Foo> _mapper = _factory.CreateClassMapBuilder<Foo>();       
    
    _mapper.Map(x => x.id);
    _mapper.Map(x => x.name);       
    
    return _mapper.Build();
}   

然后我这样注册映射:

_context.RegisterClassMap(CreateMap());

我会得出这样的结果:

Id,name,Date
d2e0b6d5-356c-4c34-9437-92942ee9232c,SomeName,2020-01-01

但我想要的结果是:

Id,name
d2e0b6d5-356c-4c34-9437-92942ee9232c,SomeName

我想澄清一件事,这是在 16.0.0.0 版本下工作的

RegisterClassMapConfiguration 移动到 Context。您必须在 CsvWriter.Context.

上注册它
public static void Main(string[] args)
{    
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        // Configuration settings
    };
    
    using (CsvWriter _csvWriter = new CsvWriter(Console.Out, config))
    {
        var fooRecords = new List<Foo> { new Foo { id = new Guid("d2e0b6d5-356c-4c34-9437-92942ee9232c"), name = "SomeName", created = new DateTime(2020,1,1)} };

        _csvWriter.Context.RegisterClassMap(CreateMap());

        _csvWriter.WriteRecords(fooRecords);

        _csvWriter.Flush();
        
        Console.Read();
    }            
}

public class Foo
{
    public Guid id {get;set;}   
    public string name {get;set;}
    public DateTime created { get; set; }
}

private static ClassMap CreateMap()
{
    Factory _factory = new Factory();

    IHasMap<Foo> _mapper = _factory.CreateClassMapBuilder<Foo>();

    _mapper.Map(x => x.id);
    _mapper.Map(x => x.name);

    return _mapper.Build();
}