gpt4 book ai didi

c# - AutoMapper 跳过源上所有为空的成员

转载 作者:太空宇宙 更新时间:2023-11-03 14:45:06 24 4
gpt4 key购买 nike

给定这个映射

_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

预期输出

FirstName: "Jim"
LastName: "Denver"
Email: "John.Doe@gmail.com"

实际输出

FirstName: "Jim"
LastName: "Denver"
Email: NULL

映射器来自这篇文章https://stackoverflow.com/a/43947731/3511012


更新,我也尝试使用 ResolveUsing 并且它有相同的输出

_mapper.Map(personUpdateDto, person, opt => opt.ConfigureMap()
.ForAllOtherMembers(opts => opts.ResolveUsing((src, dest, srcMember, dstMember) => srcMember ?? dstMember))
);

最佳答案

如果我理解正确,那么您有一个从 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="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;
}
)));

但下面的代码可以如你所愿地工作:

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

另一种使用内联映射的方法是定义空映射器配置,然后添加内联映射:

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

关于c# - AutoMapper 跳过源上所有为空的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54677087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com