учитывая это отображение
_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 пришел из этого поста qaru.site/questions/631429/...
Обновление, я также пытался использовать ResolveUsing
и он имеет тот же вывод
_mapper.Map(personUpdateDto, person, opt => opt.ConfigureMap()
.ForAllOtherMembers(opts => opts.ResolveUsing((src, dest, srcMember, dstMember) => srcMember ?? dstMember))
);
Если я правильно понимаю, то у вас есть предопределенное отображение от PersonDto
к Person
и вы пытаетесь настроить это отображение в методе Map
. В этом случае приведенный ниже код действительно не работает так, как вы хотите, потому что лямбда в ForAllMembers
никогда не вызывается.
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;
}
)));
ConfigureMap
не переопределяет MapperConfiguration
?
.ForMember(dest => dest.Email, opt => opt.MapFrom((src, dest) => src.Email ?? dest.Email))
ForAllMembers
поэтому он не может специально смотреть наEmail
. Я попробовал адаптировать вашу идею с помощью.ForAllMembers(opts => opts.ResolveUsing((src, dest, srcMember, dstMember) => srcMember ?? dstMember))
но это имело тот же эффект, что иCondition