Карта AutoMapper, если не нуль, в противном случае пользовательский конвертировать

21

Вот мой код:

Mapper.CreateMap<Foo, Foo2>()
   .ForMember(dest => dest.Bar, opt => opt.MapFrom(src => src.Bar == null ? new BarViewModel() : src.Bar))

В принципе, «BarViewModel» имеет без параметров ctor, который устанавливает свойства в классе.

Итак, я пытаюсь сказать AutoMapper:

  

Если значение равно null, используйте ctor для класса. в противном случае используйте сопоставление, которое у вас есть.

Вышеупомянутое дает мне ошибку компилятора C #. И я предполагаю, что актер тоже не будет работать.

Итак, есть ли трюк AutoMapper?

В худшем случае я мог удалить это сопоставление для этого свойства и просто сделать:

var mapped = Mapper.Map<Foo,Foo2>(src);
if (mapped.Bar == null) mapped.Bar = new BarViewModel();

Но это немного уродливо.

Идеи?

    
задан RPM1984 19.07.2012 в 09:17
источник
  • Что такое ошибка компилятора, и почему вы считаете, что актер не будет работать? –  devuxer 19.07.2012 в 10:25

3 ответа

28

Вы можете использовать преобразователь пользовательских значений . Должно работать следующее:

Mapper.CreateMap<Foo, Foo2>()
   .ForMember(dest => dest.Bar, opt => opt.ResolveUsing(src => src.Bar == null ? new Bar() : Mapper.Map<Bar,Bar2>(src.Bar)))
    
ответ дан k0stya 19.07.2012 в 09:31
источник
  • вы это получили. та. –  RPM1984 20.07.2012 в 02:08
6

Теперь вы можете использовать .NullSubstitute() для замены значения NULL для некоторого пользовательского значения в Automapper, например:

CreateMap<SMModel, VM_SMModel>()
                    .ForMember(d => d.myDate, o => o.NullSubstitute(new DateTime(2017,12,12)));
    
ответ дан Vijai 20.09.2016 в 21:42
источник
1

Я не получаю ошибку компилятора для следующего:

public class Foo
{
    public Bar Bar { get; set; }
}

public class Foo2
{
    public Bar Bar { get; set; }
}

public class Bar
{
    public int Id { get; set; }

    public Bar()
    {
        Id = 3;
    }
}

CreateMap<Foo, Foo2>()
    .ForMember(
        dest => dest.Bar,
        opt => opt.MapFrom(src => src.Bar == null ? new Bar() : src.Bar));

... так что мне интересно, не проблема ли на самом деле с вашим отображением?

    
ответ дан devuxer 19.07.2012 в 10:31
источник
  • извините. я неправильно набрал вопрос ... обновился. –  RPM1984 20.07.2012 в 02:08
  • Просто из любопытства, BarViewModel наследует от Bar? Если да, то я думаю, что актер будет работать, и вам не понадобится ValueResolver. Но я думаю, вы уже это пробовали? –  devuxer 20.07.2012 в 04:19
  • нет, нет наследования. принятый ответ был правильным решением. –  RPM1984 20.07.2012 в 05:35