自动映射器基于枚举值映射某些bool属性

时间:2018-06-29 18:34:03

标签: c# automapper

目标类具有布尔列表。映射到目标类的DTO具有1枚举属性。取决于枚举是什么,应该设置目标类中的某些布尔值。如何在自动映射器中实现它? .ForMember()无法正常工作,因为我必须对每个bool属性进行枚举逻辑检查。 我想做一个映射this.CreateMap<DestinationDTO, Destination>(),具体取决于设置的是Property1还是Property2或Property3。

参见下文:

public class Destination
{
  public bool? Property1{get; set;}
  public bool? Property2{get; set;}
  public bool? Property3{get;set;}
}

public class DestinationDTO
{
   public Enum Payout{get; set;}
}
public Enum Payout
{
  Proration = 1,
  Recurrent = 2,
  Lumpsum = 3
}

如果DestinationDTO.Payout == Payout.Proration,我想将Destination实体类的Property1设置为true,类似地取决于它是什么支出,我可能想在实体类中设置另一个Property。将DestinationDTO映射到Destination实体类时,可以在automapper中执行此操作吗?

1 个答案:

答案 0 :(得分:2)

您可以使用ForMember表达式来做到这一点:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<DestinationDTO, Destination>()
        .ForMember(d => d.Property1,
            m => m.MapFrom(d => d.Payout == Payout.Proration ? true : default(bool?)))
        .ForMember(d => d.Property2,
            m => m.MapFrom(d => d.Payout == Payout.Recurrent ? true : default(bool?)))
        .ForMember(d => d.Property3,
            m => m.MapFrom(d => d.Payout == Payout.Lumpsum ? true : default(bool?)));
});

var mapper = config.CreateMapper();

var dtos = new[]
{
    new DestinationDTO { Payout = Payout.Proration },
    new DestinationDTO { Payout = Payout.Recurrent },
    new DestinationDTO { Payout = Payout.Lumpsum },
};

var destinations = dtos.Select(d => mapper.Map<Destination>(d));

题外话:我更喜欢不可为null的布尔值。然后,您可以删除? true : default(bool?)部分,而Destination仍然在其所有属性中都说实话。