我正在使用自动映射器来更新对象的属性; “合并”两个对象,但仅当源成员为!= null时。 (根据this question)
显然,它不适用于枚举。调用MergeObject方法后,它将映射到枚举默认值(Pendente
),而不是忽略它并将目标保持不变。
例如,对于可为null的int来说,它可以正常工作。
在调试时,如果我在条件(=> member != null
)上设置一个断点,即使Pendente
为空,它也会显示member = 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);
}
EDIT1:
我的目标是基本上实现here中描述的功能,但看不到属性IsSourceValueNull
。
EDIT2: 我设法使用下面的代码实现了自己的目标,但是我必须明确指定成员。是否有将其应用于所有成员的通用方法?
cfg.CreateMap<FooViewModel, Foo>()
.ForMember(dest => dest.Situacao, opt => opt.MapFrom((source, dest) => source.Situacao ?? dest.Situacao));
答案 0 :(得分:3)
看起来您的枚举在第二种类型中不可为空。
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
}
答案 1 :(得分:0)
在我的第二次编辑中最终使用了该解决方案,谢谢大家的投入。
cfg.CreateMap<FooViewModel, Foo>()
.ForMember(dest => dest.Situacao, opt => opt.MapFrom((source, dest) => source.Situacao ?? dest.Situacao));