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
可以为空,在这种情况下,生成的 CSV 输出包含 00000000-0000-0000-0000-000000000000SkuNumber
而不是空单元格。那么是否可以忽略InnerSku
if 它的 null ?
解决方案
AGuid
不能为空,因此它默认为空Guid
,您可以在 CSV 输出中看到。一种解决方案是更改SkuNumber
为可为空的Guid
public class InnerSkuDto
{
public Guid? SkuNumber;
}
如果您不能或不想更改SkuNumber
为 nullable Guid
,另一种选择是使用自定义转换器。这里我重写ConvertToString
了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
.
csv.Configuration.TypeConverterCache.AddConverter<Guid>(new EmptyGuidConverter());
推荐阅读
- c++ - 将值插入排序数组而不破坏顺序的类函数
- python - df.combine() 是如何工作的?
- javascript - 如何从另一个数组中推送到一个数组?
- typescript - 在 fp-ts 中将 union 类型转换为 Either 类型
- bash - 如何在匹配两个不同字符串的行末尾添加两个空格
- python - 将python程序转换为exe形式时出错
- java - 从 Java 中的 lambda 表达式引用变量
- syntax-error - 需要帮助:语法错误,amibroker AFL 中的意外功能
- css - 如何定位 2 个项目,一个在中心,一个在左侧?
- php - 解决安全漏洞 https://symfony.com/cve-2020-15094