鉴于此映射
_mapper.Map(personDto, person, opt => opt.ConfigureMap()
.ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null))
);
person
在映射之前
FirstName: "John"
LastName: "Doe"
Email: "[email protected]"
personDto
在映射之前
FirstName: "Jim"
LastName: "Denver"
Email: NULL
预期产量person
FirstName: "Jim"
LastName: "Denver"
Email: "[email protected]"
实际输出person
FirstName: "Jim"
LastName: "Denver"
Email: NULL
mapper来自这篇文章https://stackoverflow.com/a/43947731/3511012
更新,我也尝试使用ResolveUsing
,它具有相同的输出
_mapper.Map(personUpdateDto, person, opt => opt.ConfigureMap()
.ForAllOtherMembers(opts => opts.ResolveUsing((src, dest, srcMember, dstMember) => srcMember ?? dstMember))
);
如果我理解正确,那么你有一个从PersonDto
到Person
的预定义映射,并尝试在Map
方法中配置该映射。在这种情况下,下面的代码实际上不能正常工作,因为ForAllMembers
中的lambda永远不会被调用。
var config = new MapperConfiguration(cfg => cfg.CreateMap<PersonDto, Person>());//.ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null)));
var mapper = config.CreateMapper();
var person = new Person { FirstName = "John", LastName = "Snow" ,Email="[email protected]"};
var personUpdateDto = new PersonDto { FirstName = "Jim", LastName = "Denver" };
var a = mapper.Map(personUpdateDto, person, opt => opt.ConfigureMap()
.ForAllMembers(opts => opts.Condition((src, dest, srcMember) =>
{
return srcMember != null;
}
)));
但是下面的代码可以按您的方式工作:
var config = new MapperConfiguration(cfg => cfg.CreateMap<PersonDto, Person>().ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null)));
var mapper = config.CreateMapper();
var person = new Person { FirstName = "John", LastName = "Snow", Email = "[email protected]" };
var personUpdateDto = new PersonDto { FirstName = "Jim", LastName = "Denver" };
var a = mapper.Map(personUpdateDto, person);
使用内联映射的另一种方法是定义空映射器配置,然后添加内联映射:
var config = new MapperConfiguration(cfg => { });
var mapper = config.CreateMapper();
var person = new Person { FirstName = "John", LastName = "Snow", Email = "[email protected]" };
var personUpdateDto = new PersonDto { FirstName = "Jim", LastName = "Denver" };
var a = mapper.Map(personUpdateDto, person,opts=>opts.ConfigureMap()
.ForAllMembers(opts2 => opts2.Condition((src, dest, srcMember) =>
{
return srcMember != null;
}
)));