39

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

例如,如果我们有:

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))

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

4

3 回答 3

56

Ignore() 功能仅适用于您从不映射的成员,因为这些成员在配置验证中也会被跳过。我检查了几个选项,但看起来像自定义值解析器之类的东西不能解决问题。

当条件为真时,使用Condition()功能映射成员:

Mapper.CreateMap<CarViewModel, Car>()
 .ForMember(dest => dest.Code, opt => opt.Condition(source => source.Id != 0))
于 2010-03-16T12:47:44.953 回答
6

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

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

于 2011-04-28T23:18:10.877 回答
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))
于 2019-04-16T13:48:21.260 回答