有条件地忽略引用映射

时间:2019-12-06 04:40:50

标签: csvhelper

如果满足特定条件,是否可以通过编程/动态方式忽略参考映射?

考虑以下结构

public class SkuDto
{
    public string Name;
    public InnerSkuDto InnerSku;
}

public class InnerSkuDto
{
    public Guid SkuNumber;
}

public sealed class SkuMap : ClassMap<SkuDto>
{
    Map(m => m.Name);
    References<InnerSkuMap>(m => m.InnerSku);
}

public sealed class InnerSkuMap : ClassMap<InnerSkuDto> { ... }

现在,InnerSku对象中的SkuDto属性有时可以为null,在这种情况下,结果CSV输出包含SkuNumber的00000000-0000-0000-0000-0000-000000000000而不是空单元格。这样是否可以忽略InnerSku如果它为null?

1 个答案:

答案 0 :(得分:1)

Guid不能为null,因此默认为空Guid,您可以在CSV输出中看到。一种解决方案是将SkuNumber更改为可为空的Guid

public class InnerSkuDto
{
    public Guid? SkuNumber;
}

如果您不能或不想将SkuNumber更改为可为空的Guid,则另一个选择是使用自定义转换器。在这里,我重写了ConvertToString的{​​{1}}方法。

GuidConverter

或者可以为所有public class EmptyGuidConverter : GuidConverter { public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) { if ((Guid)value == Guid.Empty) { return string.Empty; } return base.ConvertToString(value, row, memberMapData); } } public sealed class InnerSkuMap : ClassMap<InnerSkuDto> { public InnerSkuMap() { Map(m => m.SkuNumber).TypeConverter<EmptyGuidConverter>(); } } 值向CsvWriter注册转换器,而不是为单个属性注册转换器。只需确保在注册Guid之前添加它即可。

ClassMap