[英]AutoMapper Conditional Mapping based on source and destination
I need to map a UpdateViewModel
to its Model
.我需要将
UpdateViewModel
映射到它的Model
。 The Model
is Model
是
public class Model
{
// ...
public DateTime? Disabled
}
The UpdateViewModel
is UpdateViewModel
是
public class UpdateViewModel
{
// ...
Status Status
}
public enum Status
{
Disabled,
Active
}
I now have this code我现在有这个代码
if(uvm.Status == Status.Active)
{
model.Disabled = null;
}
else
{
if(model.Disabled == null)
{
model.Disabled = DateTime.UtcNow;
}
}
I want to get this in my Map but i struggle to have an if/else condition and I struggle to set Disabled
to null
.我想在我的地图中得到这个,但我很难有一个 if/else 条件,我很难将
Disabled
设置为null
。
It should cover the following cases:它应涵盖以下情况:
Model.Disabled == null and uvm.Status == Status.Disabled -> Set model.Disabled to DateTime.UtcNow Model.Disabled == null 和 uvm.Status == Status.Disabled -> 将 model.Disabled 设置为 DateTime.UtcNow
Model.Disabled == null and uvm.Status == Status.Active -> Stay with model.Disabled = null Model.Disabled == null 和 uvm.Status == Status.Active -> 保持 model.Disabled = null
Model.Disabled != null and uvm.Status == Status.Disabled -> Stay with current model.Disabled Model.Disabled != null 和 uvm.Status == Status.Disabled -> 保持当前 model.Disabled
Model.Disabled != null and uvm.Status == Status.Active -> Set model.Disabled to null Model.Disabled != null 和 uvm.Status == Status.Active -> 将 model.Disabled 设置为 null
I managed to get this working with an IValueResolver我设法使用 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;
}
}
}
and和
CreateMap<UpdateViewModel, Model>()
.ForMember(model => model.Disabled, opt => opt.MapFrom<DisabledResolver>());
You can create custom configuration rules for mapping between types.您可以为类型之间的映射创建自定义配置规则。 For example,
例如,
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()
};
}));
});
and then接着
var mapper = new Mapper(configuration);
var result = mapper.Map<UpdateViewModel,Model>(uModel,model);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.