gpt4 book ai didi

c# - 如何全局忽略映射源空值?

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

有没有办法全局(对于所有映射配置)忽略空值到目标的映射?

这里有一些东西:

    //Automapper config
Mapper.Initialize(cfg =>
{
//Initializes all mapping profiles in the assembly
cfg.AddProfiles(Assembly.GetExecutingAssembly().GetName().Name);

//If map is called without a profile creates default map
cfg.CreateMissingTypeMaps = true;
});

这是例如映射。这是我正在努力完成的一个例子。

//Models
class User {
public string Name {get; set;}
public string Email {get; set;}
public string Password {get; set;}
}

class UserDto {
public string Name {get; set;}
public string Email {get; set;}
}

//Start instances
var user = new User { Name = "John", Email = "john@live.com", Password = "123"};

var userDto = new UserDto { Name = "Tim" };
//Notice that we left the Email null on the DTO


//Mapping
Mapper.Map(userDto, user);

结果以用户收到空电子邮件而告终。我希望用户电子邮件不会更改,除非在源 (userDto) 上提供了新电子邮件。换句话说,忽略所有类型的所有空属性覆盖目标(用户)的源对象

更新:以下所有答案均无法解决问题。它们根本不适用于收藏。虽然 Autommaper 找出了这个错误,但我能够通过使用 ExpandoObject 在映射之前过滤掉所有空属性来解决我的问题,如下所示:

var patchInput = new ExpandoObject() as IDictionary<string, object>;

foreach (var property in userDto.GetType().GetProperties())
if (property.GetValue(userDto) is var propertyValue && propertyValue != null)
patchInput.Add(property.Name, propertyValue);

Mapper.Map(patchInput, user);

最佳答案

应该可以的

Mapper.Initialize(cfg =>
{
cfg.AddProfiles(Assembly.GetExecutingAssembly().GetName().Name);
cfg.CreateMissingTypeMaps = true;
cfg.ForAllMaps((typeMap, map) =>
map.ForAllMembers(option => option.Condition((source, destination, sourceMember) => sourceMember != null)));
});

关于c# - 如何全局忽略映射源空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46428585/

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