使用.Constant()与CsvHelper进行错误映射

时间:2019-08-28 15:19:15

标签: csvhelper

我正在尝试使用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映射,而不是使用恒定值填充属性。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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");
    }
}