AutoMapper中继承类的默认映射配置

时间:2017-11-29 14:36:40

标签: c# inheritance automapper

是否可以在AutoMapper中创建默认目标映射?

源类:

class SourceA { 
  public string X { get; set; } 
}
class SourceB { 
  public string Y { get; set; } 
}

目的地课程:

class DestBase { 
  public List<string> Z { get; set; }
}
class DestA : DestBase { 
  public string X { get; set; } 
}
class DestB : DestBase { 
  public string Y { get; set; } 
}

映射配置包含以下内容:

cfg.CreateMap<SourceA, DestA>()
  .ForMember(dest => dest.Z, src => src.MapFrom(s => null));
cfg.CreateMap<SourceB, DestB>()
  .ForMember(dest => dest.Z, src => src.MapFrom(s => null));

是否可以为继承DestBase的所有目标类创建默认映射,以避免重复的.ForMember(...)行?

例如。类似的东西:

cfg.CreateMap<object, DestBase>
   .ForMember(dest => dest.Z, src => src.MapFrom(s => new List<string>()));

1 个答案:

答案 0 :(得分:2)

原则上是的,使用Include方法,但有一点需要注意。

如果您从源类型object定义地图,则此地图将匹配所有类型。也许您可以为应该受此映射影响的源类型引入接口ISource

所以看起来像这样:

    class SourceA : ISource { 
        public string X { get; set; } 
    }

    class SourceB : ISource { 
        public string Y { get; set; } 
    }

    cfg.CreateMap<ISource, DestBase>
       .Include<SourceA, DestA>
       .Include<SourceB, DestB>
       .Include<SourceC, DestC>
       .ForMember(dest => dest.Z, , o => o.MapFrom(src => new List<string>()));

    cfg.CreateMap<SourceA, DestA>()
        .ForMember(dest => dest.X, o => o.MapFrom(src => src.X));

    cfg.CreateMap<SourceB, DestB>()
        .ForMember(dest => dest.Y, o => o.MapFrom(src => src.Y));

    // still need to create a map even if no additional properties are to be mapped
    cfg.CreateMap<SourceC, DestC>();

请注意,即使没有其他要映射的属性,您仍需要为所有包含的类型创建地图。