我需要解析主要映射到特定类的传入CSV文件。但是,如果客户愿意,可以允许客户在记录末尾添加额外的“用户定义”字段。所以CSV可能看起来像:
Id,FirstName,LastName,MyExtraField1,MyExtraField2
1,John,Doe,foo,bar
2,Jane,Smith,foo2,bar2
我的类已经为Id,FirstName和LastName命名了属性,但是没有为MyExtraField1和MyExtraField2命名。
如果我在名为“ExtraFields”的类上创建了一个新属性,这是一个Dict,是否可以在CSV中使用与该类不匹配的任何字段并将其填入ExtraFields字典?键将是标题中字段的名称,然后是该记录的值。或者是否有其他方法来捕获这些不映射到类中任何属性的字段?
我相信这会得到你想要的东西。
static void Main(string[] args)
{
using (MemoryStream stream = new MemoryStream())
using (StreamWriter writer = new StreamWriter(stream))
using (StreamReader reader = new StreamReader(stream))
using (CsvReader csv = new CsvReader(reader))
{
writer.WriteLine("Id,FirstName,LastName,MyExtraField1,MyExtraField2");
writer.WriteLine("1,John,Doe,foo,bar");
writer.WriteLine("2,Jane,Smith,foo2,bar2");
writer.Flush();
stream.Position = 0;
csv.Read();
csv.ReadHeader();
var headers = csv.Context.HeaderRecord.ToList();
csv.Configuration.RegisterClassMap(new TestClassMap(headers.Skip(3)));
var records = csv.GetRecords<TestClass>().ToList();
}
}
public class TestClass
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Dictionary<string, string> ExtraFields { get; set; }
}
public sealed class TestClassMap : ClassMap<TestClass>
{
public TestClassMap(IEnumerable<string> headers)
{
Map(m => m.Id);
Map(m => m.FirstName);
Map(m => m.LastName);
Map(m => m.ExtraFields).ConvertUsing(row => headers.ToDictionary(h => h, h => row.GetField(h)));
}
}