C# AutoMapper映射到枚举默认值,而不是在null时跳过
我正在使用automapper更新对象的属性;合并两个对象,但仅当源成员为!=无效的据 显然,它不适用于枚举。调用MergeObject方法后,它将映射到枚举默认值Pendente,而不是忽略它并保持目标不变 例如,它可以很好地用于可为null的int 调试时,如果我在条件=>member!=null,它将显示member=Pendente,即使Source.Situacao为null 点击F10将转到下一个成员,但您可以看到它更改了destination.Situacao值 对我来说这似乎是一个错误,但我的电脑已经关闭了。有什么想法吗C# AutoMapper映射到枚举默认值,而不是在null时跳过,c#,enums,automapper,nullable,C#,Enums,Automapper,Nullable,我正在使用automapper更新对象的属性;合并两个对象,但仅当源成员为!=无效的据 显然,它不适用于枚举。调用MergeObject方法后,它将映射到枚举默认值Pendente,而不是忽略它并保持目标不变 例如,它可以很好地用于可为null的int 调试时,如果我在条件=>member!=null,它将显示member=Pendente,即使Source.Situacao为null 点击F10将转到下一个成员,但您可以看到它更改了destination.Situacao值 对我来说这似乎是一
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);
}
第二种类型中的枚举似乎不可为空
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
}
第二种类型中的枚举似乎不可为空
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
}
最后在我的第二次编辑中使用了该解决方案,感谢大家的投入
cfg.CreateMap<FooViewModel, Foo>()
.ForMember(dest => dest.Situacao, opt => opt.MapFrom((source, dest) => source.Situacao ?? dest.Situacao));
最后在我的第二次编辑中使用了该解决方案,感谢大家的投入
cfg.CreateMap<FooViewModel, Foo>()
.ForMember(dest => dest.Situacao, opt => opt.MapFrom((source, dest) => source.Situacao ?? dest.Situacao));
这就是为什么我创建了映射以仅映射null映射值的类型不可为null,因此它将默认为第一个枚举值。如果交换枚举中的值,则每次仅拾取第一个值。否则您会期望什么行为?我希望它根据条件跳过此成员相对于源中的值的映射。这不是它应该工作的方式吗?Automapper很可能会跳过该属性。做一个新的FooModel,告诉我Situacao在实例化中的价值是什么。您将看到全新的FooModel将选择枚举的默认值。如果希望它为null或其他默认值,则需要定义它。它实际上是在更改目标对象的属性,而不是完全跳过它。这与枚举属性的默认值无关。可能是当源属性为null,因此与条件不匹配时,要存储到目标属性中的值是该枚举的默认值,但问题不是目标对象上的属性默认为该枚举的值,问题是,默认值实际上是由映射程序写入属性的。这就是为什么我创建了映射,以便只映射那些是的成员!=null映射值的类型不可为null,因此它将默认为第一个枚举值。如果交换枚举中的值,则每次仅拾取第一个值。否则您会期望什么行为?我希望它根据条件跳过此成员相对于源中的值的映射。这不是它应该工作的方式吗?Automapper很可能会跳过该属性。做一个新的FooModel,告诉我Situacao在实例化中的价值是什么。您将看到全新的FooModel将选择枚举的默认值。如果希望它为null或其他默认值,则需要定义它。它实际上是在更改目标对象的属性,而不是完全跳过它。这与枚举属性的默认值无关。可能是当源属性为null因此与条件不匹配时,要存储到目标属性中的值是该枚举的默认值,但问题不是目标对象上的属性默认为该枚举的值,而是默认值实际上是由映射器写入属性的。