AutoMapper跳过源中所有为空的成员 [英] AutoMapper skip all members on source that are null
问题描述
给出此映射
_mapper.Map(personDto, person, opt => opt.ConfigureMap()
.ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null))
);
person
映射之前
FirstName: "John"
LastName: "Doe"
Email: "John.Doe@gmail.com"
personDto
映射之前
FirstName: "Jim"
LastName: "Denver"
Email: NULL
预期的输出 person
FirstName: "Jim"
LastName: "Denver"
Email: "John.Doe@gmail.com"
实际输出 person
FirstName: "Jim"
LastName: "Denver"
Email: NULL
映射器来自此帖子 https://stackoverflow.com/a/43947731/3511012
更新,我也尝试使用 ResolveUsing
,它具有相同的输出
Update, I also tried using ResolveUsing
and it has the same output
_mapper.Map(personUpdateDto, person, opt => opt.ConfigureMap()
.ForAllOtherMembers(opts => opts.ResolveUsing((src, dest, srcMember, dstMember) => srcMember ?? dstMember))
);
推荐答案
如果我理解正确,那么您有一个从 PersonDto
到 Person
的预定义映射,并尝试对其进行配置在 Map
方法中进行映射.在这种情况下,下面的代码实际上并没有按您希望的那样工作,因为从未调用 ForAllMembers
中的lambda.
If I understand correctly then you have a predefined mapping from PersonDto
to Person
and trying to configure that mapping in the Map
method. In that case, the code below really doesn't work as you want because the lambda in the ForAllMembers
is never being called.
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="test@mail.com"};
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;
}
)));
但是下面的代码可以根据需要工作:
But the code below works as you want:
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 = "test@mail.com" };
var personUpdateDto = new PersonDto { FirstName = "Jim", LastName = "Denver" };
var a = mapper.Map(personUpdateDto, person);
使用内联映射的另一种方法是定义空的映射器配置,然后添加内联映射:
Another way to work with inline maps is to define empty mapper configuration and then add inline maps:
var config = new MapperConfiguration(cfg => { });
var mapper = config.CreateMapper();
var person = new Person { FirstName = "John", LastName = "Snow", Email = "test@mail.com" };
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;
}
)));
这篇关于AutoMapper跳过源中所有为空的成员的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!