Question

Is it possible to ignore mapping a member depending on the value of a source property?

For example if we have:

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; }
}

I'm looking for something like

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

So far the only solution I have is too use two different view models and create different mappings for each one.

Was it helpful?

Solution

The Ignore() feature is strictly for members you never map, as these members are also skipped in configuration validation. I checked a couple of options, but it doesn't look like things like a custom value resolver will do the trick.

Use the Condition() feature to map the member when the condition is true:

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

OTHER TIPS

I ran into a similar issue, and while this will overwrite the existing value for dest.Code with null, it might be helpful as a starting point:

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

Here is the documentation of the conditional mapping: http://docs.automapper.org/en/latest/Conditional-mapping.html

There's also another method called PreCondition very useful on certain scenarios since it runs before the source value is resolved in the mapping process:

Mapper.PreCondition<CarViewModel, Car>()
 .ForMember(dest => dest.Code, opt => opt.Condition(source => source.Id == 0))
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top