首页 > 解决方案 > 有条件地忽略参考映射

问题描述

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

考虑以下结构

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可以为空,在这种情况下,生成的 CSV 输出包含 00000000-0000-0000-0000-000000000000SkuNumber而不是空单元格。那么是否可以忽略InnerSkuif 它的 null ?

标签: csvhelper

解决方案


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

public class InnerSkuDto
{
    public Guid? SkuNumber;
}

如果您不能或不想更改SkuNumber为 nullable Guid,另一种选择是使用自定义转换器。这里我重写ConvertToStringGuidConverter.

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.

csv.Configuration.TypeConverterCache.AddConverter<Guid>(new EmptyGuidConverter());

推荐阅读