通过 AutoMapper 使用构造函数和参数创建对象

Create Object Using Constructor and Argument with AutoMapper

我有一个场景,我想创建一个对象 (Calc),它将一些选项作为构造函数参数。碰巧我有一个 Calc 的序列化版本,它的属性和选项属性作为另一个单个对象。这是我的代码:

void Main()
{
    var mockMapper = new MapperConfiguration(c =>
    {
        c.AddProfile<MapperProf>();
    })
    .CreateMapper();
}

public class MapperProf : Profile
{
    public MapperProf()
    {
        CreateMap<Scen, Calc>()
            .ConstructUsing(c => new Calc())  // I AM STUCK HERE
            
            
        CreateMap<Scen, Opt>()
            .ForMember(o => o.OptProp, o => o.MapFrom(o => o.OptProp));
    }
}

public class Calc
{
    public Calc(Opt opt)
    {
        OptProp = opt.OptProp;
    }
    
    public string CalcProp { get; set; }
    
    private string OptProp { get; set; }
}

public class Opt
{
    
    
    public string OptProp { get; set; }
}

public class Scen
{
    public string CalcProp { get; set; }
    public string OptProp { get; set; }
}

由于各种原因我无法访问Calc.OptProp,我必须通过构造函数参数传入它。

换句话说,我想一次性完成的是:

Calc c = mockMapper.Map<Calc>().ConstructUsing(c => new Calc(mockMapper.Map<Opt>(scen)));

也就是说,从同一个 Scen.

构造 CalcOpt

ConstructUsing 中,您可以使用 ResulotionContext,然后使用映射器创建构造函数,如下所示:

public class MapperProf : Profile
{
   public MapperProf()
   {
    CreateMap<Scen, Opt>().ForMember(o => o.OptProp, o => o.MapFrom(scen => scen.OptProp));

    CreateMap<Scen, Calc>().ConstructUsing((scen, context) => new Calc(context.Mapper.Map<Scen, Opt>(scen)));
   }
};

映射场景:

var scen = new Scen() { CalcProp = "Calc", OptProp = "Opt" };

var calc = mockMapper.Map<Scen, Calc>(scen);