目标Fx:.Net Core 2
CsvHelper:6.0.0(最新)
人员CSV
Name
Nikhil
人员类
public class Person {
public string Name { get; set; }
public Address Address { get; set; } // Address has AddLine1, Addline2
}
人物地图
public class PersonMap : ClassMap<Person> {
public PersonMap() {
AutoMap();
Map(p => p.Address).Ignore(); // This causes exception
}
}
这可以通过以下方式解决:
Map(p => p.Address.AddLine1).Ignore();
Map(p => p.Address.AddLine2).Ignore();
实际上,我想忽略的类类型有很多道具。所以我很想知道CsvHelper是否已经提供了忽略整个类型(Map(p => p.Address).Ignore()
类型)的任何内容,我还不知道。
答案 0 :(得分:0)
我之前从未使用过这个库,所以请带上一些盐:
它似乎是将Address
映射为引用映射,而不是字段映射。它很可能是一个错误 - 或者至少是 - 意外的行为,因为忽略引用映射实际上没有做任何事情。这可能值得报道。它应该递归地忽略其中的所有字段映射。
也就是说,有一种解决方法:手动删除引用映射。你可以写一个扩展名:
public static class Extensions
{
public static void RemoveReference<T, TT>(this ClassMap<T> classMap, Expression<Func<T, TT>> expr)
{
var memberExpr = expr.Body as MemberExpression;
var member = memberExpr.Member;
var referenceMapsToRemove = classMap.ReferenceMaps.Where(rm => rm.Data.Member == member).ToList();
foreach (var referenceMapToRemove in referenceMapsToRemove)
{
classMap.ReferenceMaps.Remove(referenceMapToRemove);
}
}
}
然后您的代码变为:
public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
AutoMap();
this.RemoveReference(p => p.Address);
}
}
如上所述,我对这个库并不是很熟悉。您可能必须调整它以忽略引用映射中的所有字段映射,而不是彻底删除它。