如何使用Ignore()忽略类类型?

时间:2017-11-16 15:33:41

标签: c# csvhelper

目标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()类型)的任何内容,我还不知道。

Fiddle

1 个答案:

答案 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);
    }
}

如上所述,我对这个库并不是很熟悉。您可能必须调整它以忽略引用映射中的所有字段映射,而不是彻底删除它。