使用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,然后使用mapper创建这样的构造函数:

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);

最新更新