[英]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.