AutoMapper跳过源上为null的所有成员

问题描述 投票:2回答:1

鉴于此映射

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

c# automapper
1个回答
0
投票

如果我理解正确,那么你有一个从PersonDtoPerson的预定义映射,并尝试在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;
}
)));
© www.soinside.com 2019 - 2024. All rights reserved.