2013-07-23 2 views
27

Предположим, у меня есть следующие объекты (классы)Как настроить условное сопоставление в AutoMapper?

public class Target 
{ 
    public string Value; 
} 


public class Source 
{ 
    public string Value1; 
    public string Value2; 
} 

Теперь я хочу, чтобы настроить автоматическую карту, чтобы Карта Value1 до значения, если Значение1 начинается с «А», но в противном случае я хочу карту Value2 к стоимости.

Это то, что я до сих пор:

Mapper 
    .CreateMap<Source,Target>() 
    .ForMember(t => t.Value, 
     o => 
      { 
       o.Condition(s => 
        s.Value1.StartsWith("A")); 
       o.MapFrom(s => s.Value1); 
        <<***But then how do I supply the negative clause!?***>> 
      }) 

Однако часть все еще ускользает меня, как сказать AutoMapper к идут принять s.Value2 должен ранее условие не выполняется.

Мне кажется, что API не был спроектирован так хорошо, как это могло бы быть ... но может быть, это мое отсутствие знаний мешает.

+1

Просто у вас есть второй вызов 'ForMember' с обратным условием в этом, если вы действительно застряли, и ответ, предоставленный Tejal, не сокращает его. – Joe

ответ

74

Попробуйте этот вариант Условия

Mapper.CreateMap<Source, Target>() 
     .ForMember(dest => dest.Value, 
        opt => opt.MapFrom 
        (src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2)); 

используется для добавления условий для свойств, которые должны быть выполнены до того, что имущество будет отображаться и вариантом MapFrom используются для выполнения пользовательского источника/отображений членов назначения.

+0

Хм, мне тоже нужно как-то получить доступ к целевому значению - но все же это отвечает на заданный вопрос. – Alwyn

+0

Что именно вы пытаетесь сделать? – Tejal

+0

Условие немного сложнее, чем описанное, которое зависит только от исходного значения. Мне нужно как-то добраться до контекста разрешения и выяснить целевое значение. – Alwyn

2

С условным отображением вы можете настроить только при выполнении сопоставления для указанного свойства назначения.

Значит, вы не можете определить два сопоставления с разными условиями для одного и того же свойства назначения.

Если у вас есть условие, как «если условие истинно, то использовать PropertyA еще использовать PropertyB», то вы должны сделать это как «Tejal» писал:

opt.MapFrom(src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2) 
2

AutoMapper позволяет добавлять условия для свойств, которые должны перед тем как это свойство будет отображаться.

Я занимался картированием с некоторыми условиями перечисления, посмотрю, что мало усилий для сообщества с моей стороны.

.ForMember(dest => dest.CurrentOrientationName, opts => opts.MapFrom(src => src.IsLandscape ? PageSetupEditorOrientationViewModel.Orientation.Landscape : PageSetupEditorOrientationViewModel.Orientation.Portrait)); 
Смежные вопросы