【问题标题】:CsvHelper Field with name does not exist具有名称的 CsvHelper 字段不存在
【发布时间】:2020-11-15 08:24:33
【问题描述】:

我有这个班级和班级地图:

public class Subjects
{
    private readonly IEncryption _encryption;
    
    public Subjects(IEncryption encryption)
    {
        _encryption = encryption;
    }

    public Guid SubjectId { get; set; }
    public string Code { get; set; }
    public Guid OrganizationId { get; set; }
    public string PreferredName { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public DateTime? DateOfBirth { get; set; }
    public string Gender { get; set; }
    public string LastNameInitial { get; set; }
    public string CodeDisplay { get; set; }
    public Guid? RaceId { get; set; }
    public Guid? MaritalStatusId { get; set; }
    public Guid? StatusId { get; set; }
    public string Rank { get; set; }
    public string Email { get; set; }
    public string MobilePhone { get; set; }
    public bool MobilePhoneDoNotLeaveMsg { get; set; }
    public bool MobilePhoneDoNotText { get; set; }
    public string WorkPhone { get; set; }
    public bool WorkPhoneDoNotLeaveMsg { get; set; }
}

public sealed class SubjectsMap : ClassMap<Subjects>
{
    public SubjectsMap()
    {
        AutoMap(CultureInfo.InvariantCulture);
        Map(m => m.Code).Name("Code");
        Map(m => m.OrganizationId).Name("OrganizationId");
        Map(m => m.PreferredName).Name("PreferredName");
        Map(m => m.FirstName).Name("FirstName");
        Map(m => m.MiddleName).Name("MiddleName");
        Map(m => m.LastName).Name("LastName");
        Map(m => m.DateOfBirth).Name("DateOfBirth");
        Map(m => m.Gender).Name("Gender");
        Map(m => m.LastNameInitial).Name("LastNameInitial");
        Map(m => m.CodeDisplay).Name("CodeDisplay");
        Map(m => m.RaceId).Name("RaceId");
        Map(m => m.MaritalStatusId).Name("MaritalStatusId");
        Map(m => m.StatusId).Name("StatusId");
        Map(m => m.Rank).Name("Rank");
        Map(m => m.Email).Name("Email");
        Map(m => m.MobilePhone).Name("MobilePhone");
        Map(m => m.MobilePhoneDoNotLeaveMsg).Name("MobilePhoneDoNotLeaveMsg");
        Map(m => m.MobilePhoneDoNotText).Name("MobilePhoneDoNotText");
        Map(m => m.WorkPhone).Name("WorkPhone");
        Map(m => m.WorkPhoneDoNotLeaveMsg).Name("WorkPhoneDoNotLeaveMsg");
    }
}

我有一个构造函数,它注入了我需要用于一些 getter 的加密方法,这些 getter 将加密 get 上的字符串。当我尝试将 CSV 读入类文件时:

public List<Subjects> ParseSubjectCSV(string inputFilePath)
    {
        using (var reader = new StreamReader(inputFilePath))
        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        {
            csv.Configuration.RegisterClassMap<SubjectsMap>();
            csv.Configuration.HeaderValidated = null;
            var records = csv.GetRecords<Subjects>().ToList();
            return records;
        }
    }

我收到此错误:

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

所以我修改了我的代码,将 MissingFieldFound 添​​加为 null 并引发了错误:

无法进行转换 Text:'' MemberType: TypeConverter "CsvHelper.TypeConvertion.DefaultTypeConverter"。

如果我删除构造函数和依赖注入,那么 with 就可以了。可以使用 CSV 映射到具有构造函数的类吗?

【问题讨论】:

  • 您同时使用AutoMap 并单独映射每个属性是否有原因?

标签: csvhelper


【解决方案1】:

有一个ObjectResolver 可以创建您可以使用的对象。

void Main()
{
    var s = new StringBuilder();
    s.AppendLine("Id,Name");
    s.AppendLine("1,one");
    s.AppendLine("2,two");
    using (var reader = new StringReader(s.ToString()))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        var bar = "bar";
        ObjectResolver.Current = new ObjectResolver(type => type == typeof(Foo), (type, constructorArgs) =>
        {
            return new Foo(bar);
        }, true);
        csv.Configuration.RegisterClassMap<FooMap>();
        csv.GetRecords<Foo>().ToList().Dump();
    }
}

public class Foo
{
    private readonly string bar;
    
    public int Id { get; set; }
    public string Name { get; set; }
    
    public Foo(string bar)
    {       
        this.bar = bar;
    }
}

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(m => m.Id);
        Map(m => m.Name);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2018-11-21
    • 2021-07-31
    • 2016-08-25
    • 2017-05-18
    • 2014-11-11
    • 1970-01-01
    相关资源
    最近更新 更多