Подтвердить что ты не робот

Как настроить условное сопоставление в AutoMapper?

Предположим, что у меня есть следующие сущности (классы)

public class Target
{
    public string Value;
}


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

Теперь я хочу настроить Auto Map, сопоставить Value1 с Value, если Value1 начинается с "A", но в противном случае я хочу сопоставить Value2 с Value.

Это то, что у меня есть до сих пор:

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 не был спроектирован так хорошо, как это могло бы быть... но может быть, это недостаток знаний, мешающих мне.

Пожалуйста, помогите.

4b9b3361

Ответ 1

Попробуйте это

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

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

Ответ 2

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

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

.ForMember(dest => dest.CurrentOrientationName, opts => opts.MapFrom(src => src.IsLandscape ? PageSetupEditorOrientationViewModel.Orientation.Landscape : PageSetupEditorOrientationViewModel.Orientation.Portrait));

Ответ 3

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

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

Если у вас есть условие типа "если условие истинно, то используйте PropertyA else, используйте PropertyB", тогда вы должны сделать это, как "Tejal" написал:

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