如何在AutoMapper中配置条件映射
本文关键字:配置 条件 映射 AutoMapper | 更新日期: 2023-09-27 18:24:28
假设我有以下实体(类)
public class Target
{
public string Value;
}
public class Source
{
public string Value1;
public string Value2;
}
现在,我想配置自动映射,如果Value1以"A"开头,则将Value1映射到Value,否则我想将Value2映射到Value。
这就是我目前所拥有的:
Mapper
.CreateMap<Source,Target>()
.ForMember(t => t.Value,
o =>
{
o.Condition(s =>
s.Value1.StartsWith("A"));
o.MapFrom(s => s.Value1);
<<***But then how do I supply the negative clause!?***>>
})
然而,我仍然无法理解的部分是,如果早期条件失败,如何告诉AutoMapper执行s.Value2
。
在我看来,API的设计并没有达到应有的水平……但可能是因为我缺乏知识。
试试这个
Mapper.CreateMap<Source, Target>()
.ForMember(dest => dest.Value,
opt => opt.MapFrom
(src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2));
Condition选项用于向映射该属性之前必须满足的属性添加条件,MapFrom选项用于执行自定义源/目标成员映射。
AutoMapper允许向属性添加在映射该属性之前必须满足的条件。
Mapper.CreateMap<Source,Target>()
.ForMember(t => t.Value, opt =>
{
opt.PreCondition(s => s.Value1.StartsWith("A"));
opt.MapFrom(s => s.Value1);
})
使用条件映射,您只能配置何时为指定的目标属性执行映射。
因此,这意味着您不能为同一目标属性定义两个具有不同条件的映射。
如果你有一个类似"如果条件为true,则使用PropertyA,否则使用PropertyB"的条件,那么你应该像"Tejal"这样做:
opt.MapFrom(src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2)
AutoMapper允许您在映射属性之前向必须满足的属性添加条件。
我用一些枚举条件进行了映射,从我的角度来看,这对社区来说几乎没有什么帮助。
}
.ForMember(dest => dest.CurrentOrientationName,
opts => opts.MapFrom(src => src.IsLandscape?
PageSetupEditorOrientationViewModel.Orientation.Landscape :
PageSetupEditorOrientationViewModel.Orientation.Portrait));