当地图返回null时,Automapper尝试创建对象

时间:2019-04-09 17:55:23

标签: c# automapper

当我尝试执行一些自定义映射,有时将目标属性映射为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”

1 个答案:

答案 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尝试解析   评估条件之前的目标值。所以需要   能够做到这一点而不会引发异常,即使条件   将阻止使用结果值。