似乎我们只能在ProjectTo中使用AutoMapper中的条件运算符(?:)-是否可以使用开关表达式



我有一些映射,比如:

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
};

此外,我确实尝试了接受FuncMapFrom((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的位置,即存在无效数据组合的位置。

最新更新