有条件地忽略引用映射

Conditionally Ignore reference mapping

是否可以programatically/dynamically忽略满足特定条件的引用映射?

考虑以下结构

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> { ... }

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

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

public class InnerSkuDto
{
    public Guid? SkuNumber;
}

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

ConvertToString方法
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>();
    }
}

或者不是为单个 属性 注册转换器,您可以为所有 Guid 值使用 CsvWriter 注册它。只需确保在注册您的 ClassMap.

之前添加它
csv.Configuration.TypeConverterCache.AddConverter<Guid>(new EmptyGuidConverter());