[英]AutoMapper Conditional Mapping based on source and destination
我需要將UpdateViewModel
映射到它的Model
。 Model
是
public class Model
{
// ...
public DateTime? Disabled
}
UpdateViewModel
是
public class UpdateViewModel
{
// ...
Status Status
}
public enum Status
{
Disabled,
Active
}
我現在有這個代碼
if(uvm.Status == Status.Active)
{
model.Disabled = null;
}
else
{
if(model.Disabled == null)
{
model.Disabled = DateTime.UtcNow;
}
}
我想在我的地圖中得到這個,但我很難有一個 if/else 條件,我很難將Disabled
設置為null
。
它應涵蓋以下情況:
Model.Disabled == null 和 uvm.Status == Status.Disabled -> 將 model.Disabled 設置為 DateTime.UtcNow
Model.Disabled == null 和 uvm.Status == Status.Active -> 保持 model.Disabled = null
Model.Disabled != null 和 uvm.Status == Status.Disabled -> 保持當前 model.Disabled
Model.Disabled != null 和 uvm.Status == Status.Active -> 將 model.Disabled 設置為 null
我設法使用 IValueResolver 解決了這個問題
public class DisabledResolver : IValueResolver<UpdateViewModel, Model, DateTime?>
{
public DateTime? Resolve(UpdateViewModel uvm, Model entity, DateTime? value, ResolutionContext context)
{
if(uvm.Status == Status.Active)
{
return null;
}
else
{
if(entity.Disabled == null)
{
return DateTime.UtcNow;
}
return entity.Disabled;
}
}
}
和
CreateMap<UpdateViewModel, Model>()
.ForMember(model => model.Disabled, opt => opt.MapFrom<DisabledResolver>());
您可以為類型之間的映射創建自定義配置規則。 例如,
var configuration = new MapperConfiguration(cfg => {
cfg.CreateMap<UpdateViewModel, Model>()
.ForMember(dest => dest.Disabled, opt => opt.MapFrom((src,dest)=>
{
return src.Status switch
{
Status.Active => null,
Status.Disabled when dest.Disabled is null => DateTime.UtcNow,
Status.Disabled => dest.Disabled,
_ => throw new ArgumentException()
};
}));
});
接着
var mapper = new Mapper(configuration);
var result = mapper.Map<UpdateViewModel,Model>(uModel,model);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.