当我尝试执行一些自定义映射,有时将目标属性映射为null时,Automapper会抛出异常,试图创建目标属性对象。
我已经将一个简化的项目上传到github进行演示: https://github.com/dreing1130/AutoMapper_Investigation
这是从我从Automapper 6升级到8时开始的。
如果我返回一个更新的对象而不是null,则它工作正常(尽管在这种情况下,我的应用程序希望该值为null)
我还确认每次调用映射时都会命中映射中的一个断点,以确保没有编译的执行计划
public class Source
{
public IEnumerable<string> DropDownValues { get; set; }
public string SelectedValue { get; set; }
}
public class Destination
{
public SelectList DropDown { get; set; }
}
CreateMap<Source, Destination>()
.ForMember(d => d.DropDown, o => o.MapFrom((src, d) =>
{
return src.DropDownValues != null
? new SelectList(src.DropDownValues,
src.SelectedValue)
: null;
}));
预期结果:当Source.DropdownValues为空时,Destination.DropDown为空
实际结果:引发异常
“ System.Web.Mvc.SelectList需要具有0个args或仅可选args的构造函数。参数名称:type”
答案 0 :(得分:1)
您可以在此处使用PreCondition
,如果不满足指定条件,它将避免映射(甚至尝试解析源值):
CreateMap<Source, Destination>()
.ForMember(d => d.DropDown, o =>
{
o.PreCondition(src => src.DropDownValues != null);
o.MapFrom((src, d) =>
{
return new SelectList(src.DropDownValues, src.SelectedValue);
});
});
here说明了需要此操作的原因:
对于每个属性映射,AutoMapper尝试解析 评估条件之前的目标值。所以需要 能够做到这一点而不会引发异常,即使条件 将阻止使用结果值。