automapper - 如何对可能为空的属性应用 AutoMapper ValueConverters
问题描述
我认为这是一个 AutoMapper 错误,但他们在 GitHub 中的问题模板状态是先向 SO 发布一些内容。
我希望能够应用一个IValueConverter
而不用担心空异常。
例如,我使用 aIValueConverter
在多个映射中应用一些逻辑:
public class ExampleConverter : IValueConverter<string, string>
{
public string Convert(string sourceMember, ResolutionContext context)
{
if (string.IsNullOrEmpty(sourceMember))
{
return string.Empty;
}
return sourceMember.ToUpper();
}
}
如果我有以下类型,我将映射到以下类型:
public class ExampleSource
{
public ExampleNestedSource1 A { get; set; }
}
public class ExampleNestedSource1
{
public ExampleNestedSource2 B { get; set; }
}
public class ExampleNestedSource2
{
public string Input { get; set; }
}
public class ExampleDestination
{
public string Output { get; set; }
}
我可以像这样应用转换器:
public class ExampleProfile : Profile
{
public ExampleProfile()
{
this.CreateMap<ExampleSource, ExampleDestination>(MemberList.None)
.ForMember(dst => dst.Output, opt => opt.ConvertUsing(new ExampleConverter(), src => src.A.B.Input));
}
}
然而,像这样使用转换器,当 A 或 B 为空时会引发异常:
mapper.Map<ExampleDestination>(new ExampleSource // Throws null reference
{
A = new ExampleNestedSource1(),
});
mapper.Map<ExampleDestination>(new ExampleSource()); // Throws null reference
因为opt.ConvertUsing(new ExampleConverter(), src => src.A.B.Input)
接受一个表达式,所以我不能使用像src?.A?.B?.Input
.
如果我删除转换器并使用MapFrom
,问题就会消失:
public class ExampleProfile : Profile
{
public ExampleProfile()
{
this.CreateMap<ExampleSource, ExampleDestination>(MemberList.None)
.ForMember(dst => dst.Output, opt => opt.MapFrom(src => src.A.B.Input));
}
}
但MapFrom
不支持IValueConverter
它只支持IMemberValueResolver
可重用性较低的。
有没有更好的方法来处理这种情况?
如果没有,我认为 AutoMapper 应该:
IValueConverter
在MapFrom
方法中添加对的支持。ConvertUsing
当表达式未解析为属性且未抛出时,不应调用给定的转换器。ConvertUsing
当表达式不解析为属性(以与 相同的方式MapFrom
)并且不抛出时,应该使用 null 调用给定的转换器。
解决方案
推荐阅读
- macos - 用于安装在测试仪 PC 上的 Mac 应用程序的证书和配置文件
- c++ - 有没有办法测量 c++ 程序的运行时内存使用情况?
- assembly - 为什么编译器不使用 ENTER 和 LEAVE 指令?
- java - 从构造函数 Java 中获取特定参数
- reactjs - 一起使用 SVGR 和 Material UI
- css - 为什么“cursor”的“auto”值会给我的锚点一个类似文本的光标
- java - ConcurrentModificationException 即使没有删除或添加任何元素
- javascript - 如何在java脚本中评估字符串数学表达式?
- python - MT5 开仓单返回“无”
- javascript - Missing dates to add in a json object of keys