我有一些映射,比如:
CreateMap<TrophyTransfer, TrophyTransferSaveDto>()
.ForMember(x => x.ReceiverName, opt => opt.MapFrom(y =>
y.ReceiverType == TrophyOwnerTypes.ExhibitionMuseum
? y.ExhibitionMuseum!.Name
: y.ReceiverType == TrophyOwnerTypes.TaxidermyWorkshop
? y.TaxidermyWorkshop!.Name
: y.Owner!.Name));
这很好,但根本不可读,这也是一个简单的例子,想象一下这里有5-6个其他条件。。。
我想使用switch表达式或至少if/else来编写此映射,但因为(MapFrom
)需要一个表达式,我做不到。
类似于:
return y => y.ReceiverType switch
{
TrophyOwnerTypes.ExhibitionMuseum => y.ExhibitionMuseum!.Name,
TrophyOwnerTypes.TaxidermyWorkshop => y.TaxidermyWorkshop!.Name,
_ => y.Owner!.Name
};
此外,我确实尝试了接受Func
的MapFrom((src, dest))
的另一个重载,但由于Projection部分的原因,我不能使用它(ProjectTo<>
方法)
有没有更好的方法将这些映射与投影特性一起编写?
我使用的典型方法是在显式值之间进行映射,然后在访问/序列化属性时使用要评估的逻辑进行未映射的属性:
[Serializable]
public class TrophyTransferSaveDto
{
// ...
public TrophyOwnerTypes ReceiverType { get; set; }
public string OwnerName { get; set; }
public string ExhibitionMuseumName { get; set; }
public string TaxidermyWorkshopName { get; set; }
public string ReceiverName
{
get { return ReceiverType == TrophyOwnerTypes.ExhibitionMuseum
? ExhibitionMuseumName
: ReceiverType == TrophyOwnerTypes.TaxidermyWorkshop
? TaxidermyWorkshowName
: OwnerName
}
}
然后从它们的来源映射各种名称,在不存在这些关系的地方,这些名称将为#null。ReceiverName将被映射为Ignore
。它可能应该处理与ReceiverType关联的Name为#null的位置,即存在无效数据组合的位置。