Automapper:忽略条件

时间:2010-03-15 23:28:49

标签: c# automapper

是否可以忽略根据源属性的值映射成员?

例如,如果我们有:

public class Car
{
    public int Id { get; set; }
    public string Code { get; set; }
}

public class CarViewModel
{
    public int Id { get; set; }
    public string Code { get; set; }
}

我正在寻找像

这样的东西
Mapper.CreateMap<CarViewModel, Car>()
      .ForMember(dest => dest.Code, 
      opt => opt.Ignore().If(source => source.Id == 0))

到目前为止,我唯一的解决方案是使用两个不同的视图模型,并为每个模型创建不同的映射。

3 个答案:

答案 0 :(得分:46)

Ignore()功能严格适用于您从未映射的成员,因为这些成员也会在配置验证中跳过。我检查了几个选项,但它看起来不像自定义值解析器就能解决问题。相反,我将介绍添加条件跳过配置选项,如:

Mapper.CreateMap<CarViewModel, Car>()
 .ForMember(dest => dest.Code, opt => opt.Condition(source => source.Id == 0))

答案 1 :(得分:6)

我遇到了类似的问题,虽然这会覆盖dest.Code的现有值为null,但它可能有助于作为起点:

AutoMapper.Mapper.CreateMap().ForMember(dest => dest.Code,config => config.MapFrom(source => source.Id != 0 ? null : source.Code));

答案 2 :(得分:0)

以下是条件映射的文档: http://docs.automapper.org/en/latest/Conditional-mapping.html

还有另一种称为PreCondition的方法,在某些情况下非常有用,因为它在映射过程中解析源值之前运行:

Mapper.PreCondition<CarViewModel, Car>()
 .ForMember(dest => dest.Code, opt => opt.Condition(source => source.Id == 0))