我正在使用自动映射器来更新对象的属性; “合并”两个对象,但前提是源成员为 != null。 (根据 this question )
显然它不适用于枚举。调用 MergeObject 方法后,它映射到枚举默认值 (Pendente
),而不是忽略它并保持目的地不变。
例如,它适用于可空 int。
调试时,如果我在条件 (=> member != null
) 上设置断点,它会显示 member = Pendente
,即使 Source.Situacao
为空。
按 F10 转到下一个成员,但您可以看到它更改了 destination.Situacao
值。
这对我来说似乎是一个错误,但我的 issue关门了。有什么想法吗?
public class FooViewModel
{
public Guid Id { get; set; }
public Status? Situacao { get; set; }
}
public class FooModel
{
public Guid Id { get; set; }
public Status Situacao { get; set; }
}
public enum Status
{
Pendente,
EmProcessamento,
Processada
}
private static void Initialize()
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<FooViewModel, FooModel>()
.ForAllMembers(o => o.Condition((source, destination, member) => member != null));
});
}
public static void MergeObject(FooViewModel source, FooModel destination)
{
Mapper.Map(source, destination);
}
编辑1:
我的目标是基本上实现 here 中描述的功能但我看不到属性 IsSourceValueNull
。
编辑2: 我设法使用以下行实现了我的目标,但我必须明确指定成员。有没有一种通用的方法可以将其应用于所有成员?
cfg.CreateMap<FooViewModel, Foo>()
.ForMember(dest => dest.Situacao, opt => opt.MapFrom((source, dest) => source.Situacao ?? dest.Situacao));
最佳答案
看起来您的枚举在您的第二种类型中不可为空。
public class FooModel
{
public Guid Id { get; set; }
public Status Situacao { get; set; }
}
应该是
public class FooModel
{
public Guid Id { get; set; }
public Status? Situacao { get; set; }
}
此外,我强烈建议为您的枚举设置一个安全的默认值,例如:
public enum Status
{
None,
Pendente,
EmProcessamento,
Processada
}
关于c# - AutoMapper 映射到 Enum 默认值,而不是在 null 时跳过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56081198/