【发布时间】: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)=>header.ToLower(); -
@Magnetron 我已经完成了涉及 PrepareHeaderForMatch 的额外工作,我只是没有在此处包含它,但无论如何谢谢
-
@Phil 好吧,我认为您只有两个选择,要么添加无参数构造函数,要么添加另一个接受所有属性的构造函数。我认为图书馆目前不支持另一种方式。
-
@Phill 其实还有第三个选项,就是reading by hand,我相信这就是你所说的“手动阅读”的意思。