【问题标题】:Error mapping with CsvHelper using .Constant()使用 .Constant() 与 CsvHelper 进行错误映射
【发布时间】:2020-01-01 20:53:54
【问题描述】:

我正在尝试使用 CsvHelper 将 csv 文件映射到 POCO 类。当我尝试csv.GetRecords<Client>() 时,我收到一条错误消息:

名称为“InID”的字段不存在。您可以通过将 MissingFieldFound 设置为 null 来忽略缺失的字段。

但是,我实际上是使用常量映射我的类的 InID 属性:

Map(c => c.InID).Constant(true);

根据我在文档中看到的内容,使用 Constant 应该不需要 CSV 文件中的字段。

这是我的代码:

public class Client{
  public int Id {get; set;}
  public int FirstName {get; set;}
  public int LastName {get; set;}
  public bool InID {get; set;}
  public bool InMH {get; set;}
}

public class IDMap : ClassMap<Client>
{
    public IDMap(){
        Map(c => c.InID).Constant(true);
        Map(c => c.FirstName).Name("Consumer_First_Name");
        Map(c => c.LastName).Name("Consumer_Last_Name");
    }
}

//In my Controller
List<Client> clients;
using(var csv = new CsvReader(reader))
{
    csv.Configuration.RegisterClassMap<IDMap>();
    clients = csv.GetRecords<Client>().ToList();
}

我没有看到我正在做的事情和 CsvHelper example 之间有什么不同。

注意

我确实尝试添加 csv.Configuration.MissingFieldFound = null,但所做的只是导致 CsvHelper 完全跳过 InID 映射,而不是使用常量值填充属性。

【问题讨论】:

    标签: csvhelper


    【解决方案1】:

    似乎是bug。该示例也不起作用。您可以改用ConvertUsing。

    public class IDMap : ClassMap<Client>
    {
        public IDMap()
        {
            Map(c => c.InID).ConvertUsing((IReaderRow row) => true);
            Map(c => c.FirstName).Name("Consumer_First_Name");
            Map(c => c.LastName).Name("Consumer_Last_Name");
        }
    }
    

    【讨论】:

      【解决方案2】:

      作为一种解决方法,您可以通过指定索引 -1 来指定这实际上不是源文件中的列。

      Map(c => c.InID).Index(-1).Constant(true);
      

      【讨论】:

        猜你喜欢
        • 2014-05-09
        • 1970-01-01
        • 2015-12-12
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多