目标类具有布尔列表。映射到目标类的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中执行此操作吗?
答案 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
仍然在其所有属性中都说实话。