【问题标题】:CsvHelper - mapping to non default constructor ignoring properties not included within constructorCsvHelper - 映射到非默认构造函数,忽略构造函数中不包含的属性
【发布时间】:2020-03-26 16:30:58
【问题描述】:

我创建了以下基本示例来显示我遇到的问题。如您所见,User 类有一个构造函数,它接受 3 个参数(camelCase)。

在解析行时,区域永远不会被映射。如何获取要映射的区域,是否需要指定特定的配置设置?我花了一些时间来找出匹配构造函数骆驼大小写所需的标题名称!

class Program
    {
        class User
        {
            public User(string firstName, string lastName, string email)
            {
                if (string.IsNullOrWhiteSpace(firstName))
                {
                    throw new ArgumentNullException(nameof(firstName));
                }

                if (string.IsNullOrWhiteSpace(lastName))
                {
                    throw new ArgumentNullException(nameof(lastName));
                }

                if (string.IsNullOrWhiteSpace(email))
                {
                    throw new ArgumentNullException(nameof(email));
                }

                FirstName = firstName;
                LastName = lastName;
                Email = email;
            }

            public string FirstName { get; private set; }

            public string LastName { get; private set; }

            public string Email { get; private set; }

            public string Region { get; set; }
        }

        static void Main(string[] args)
        {
            var s = new StringBuilder();
            s.AppendLine("email,firstName,lastName,Region");
            s.AppendLine("billy@bob.com,me,jerk,UK");
            s.AppendLine("you@u.com,me,fork,USA");

            using var reader = new StringReader(s.ToString());
            using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);

            var records = csv.GetRecords<User>();

            foreach (var user in records)
            {
                Console.WriteLine($"Parsing row: {csv.Context.Row}");
                Console.WriteLine($"Email: {user.Email}");
                Console.WriteLine($"First Name: {user.FirstName}");
                Console.WriteLine($"Last Name: {user.LastName}");
                Console.WriteLine($"Region: {user.Region}");
            }
        }
    }

产生以下输出

Parsing row: 2
Email: billy@bob.com
First Name: me
Last Name: jerk
Region:
Parsing row: 3
Email: you@u.com
First Name: me
Last Name: fork
Region:

我还在GitHub 上提出了一个问题。

【问题讨论】:

  • 如果可行的话,可能不是您想要的解决方案,但是可选的“region = null”构造函数参数和属性分配在这里可以使用吗?
  • 旁注:如果您提供PrepareHeaderForMatch,则无需匹配大小写,如下所示:csv.Configuration.PrepareHeaderForMatch = (header,index)=&gt;header.ToLower();
  • @Magnetron 我已经完成了涉及 PrepareHeaderForMatch 的额外工作,我只是没有在此处包含它,但无论如何谢谢
  • @Phil 好吧,我认为您只有两个选择,要么添加无参数构造函数,要么添加另一个接受所有属性的构造函数。我认为图书馆目前不支持另一种方式。
  • @Phill 其实还有第三个选项,就是reading by hand,我相信这就是你所说的“手动阅读”的意思。

标签: c# csvhelper


【解决方案1】:

正如@Magnetron 在 cmets 中指出的那样,CsvHelper 目前不支持这一点,

作者回复github issue

目前,您只能执行构造函数或成员映射,但不能同时执行。 我认为让他们两个都在 不过同时。这是我必须研究的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    相关资源
    最近更新 更多