AutoMapper Map如果不为空,否则自定义转换

RPM*_*984 30 c# automapper

这是我的代码:

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

基本上,"BarViewModel"有一个无参数的ctor,它在类中设置属性.

所以我想对AutoMapper说:

如果值为null,则使用ctor作为类.否则使用您已有的映射

以上是给我一个C#编译器错误.而且我猜测演员阵容也不会奏效.

那么有一个AutoMapper技巧吗?

最糟糕的情况我可以删除该属性的映射,只是这样做:

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

但那有点难看.

想法?

k0s*_*tya 36

您可以使用自定义值解析器.以下应该有效:

Mapper.CreateMap<Foo, Foo2>()
   .ForMember(dest => dest.Bar, opt => opt.ResolveUsing(src => src.Bar == null ? new Bar() : Mapper.Map<Bar,Bar2>(src.Bar)))
Run Code Online (Sandbox Code Playgroud)

  • Automapper 8 中不存在 `ResolveUsing()`,所以这个答案有点过时了 (6认同)

Vij*_*jai 9

现在,您可以使用.NullSubstitute()将NULL值替换为Automapper中的某个自定义值,例如:

CreateMap<SMModel, VM_SMModel>()
                    .ForMember(d => d.myDate, o => o.NullSubstitute(new DateTime(2017,12,12)));
Run Code Online (Sandbox Code Playgroud)


spo*_*ahn 6

从 Automapper 8 开始,ResolveUsing 不再是一个选项,而是 inlineFunc的,IValueResolver并且IMemberValueResolver是 。

内联函数示例

Mapper.Initialize(cfg =>
{
  cfg.CreateMap<Foo, FooViewModel>()
     .ForMember(dest => dest.BarViewModel,
       opt  => opt.MapFrom((src, dest) =>
       {
         if (src.Bar == null)
           return new BarViewModel ();

           return Mapper.Map<Bar, BarViewModel>(src.Bar);
        }));

  cfg.CreateMap<Bar, BarViewModel>();
});
Run Code Online (Sandbox Code Playgroud)

IMemberValueResolver 示例

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<Foo, FooViewModel>()
       .ForMember(dest => dest.BarViewModel,
                  opt  => opt.MapFrom<NullBarResolver, Bar>(src => src.Bar));

    cfg.CreateMap<Bar, BarViewModel>();
});

public class NullBarResolver : IMemberValueResolver<object, object, Bar, BarViewModel>
{
    public BarViewModel Resolve(object source, object destination, Bar sourceMember,
                                BarViewModel destMember, ResolutionContext context)
    {
        if (sourceMember == null)
            return new BarViewModel();

        return Mapper.Map(sourceMember, destMember);
    }
}
Run Code Online (Sandbox Code Playgroud)

这里有一些关于自定义值解析器的很好的文档。

工作演示