如何在AutoMapper中为多个映射表达式统一应用无重复条件
优化AutoMapper重复条件配置的几种方案
方案1:提取公共条件委托
把重复的非空判断逻辑提取为可复用的委托,避免每次重复编写Lambda表达式:
public class MappingConfig { // 提取公共的非空成员条件委托 private static readonly Func<object, object, object, bool> _nonNullMemberCondition = (src, dest, srcMember) => srcMember != null; public static MapperConfiguration RegisterMaps() { return new MapperConfiguration(config => { config.CreateMap<PermissaoEntity, PermissaoVO>() .ReverseMap() .ForAllMembers(o => o.Condition(_nonNullMemberCondition)); config.CreateMap<SystemCategoria, CategoriaVO>() .ReverseMap() .ForAllMembers(o => o.Condition(_nonNullMemberCondition)); }); } }
方案2:封装扩展方法(更简洁)
如果有大量映射需要添加该条件,可封装扩展方法,将CreateMap+ReverseMap+ForAllMembers的逻辑打包:
// 定义AutoMapper扩展类 public static class AutoMapperExtensions { public static IMappingExpression<TSource, TDestination> CreateMapWithNonNullCondition<TSource, TDestination>(this IMapperConfigurationExpression config) { return config.CreateMap<TSource, TDestination>() .ReverseMap() .ForAllMembers(o => o.Condition((src, dest, srcMember) => srcMember != null)); } } // 配置类中使用扩展方法 public class MappingConfig { public static MapperConfiguration RegisterMaps() { return new MapperConfiguration(config => { config.CreateMapWithNonNullCondition<PermissaoEntity, PermissaoVO>(); config.CreateMapWithNonNullCondition<SystemCategoria, CategoriaVO>(); // 其他映射直接一行搞定 }); } }
方案3:全局配置(谨慎使用)
如果所有映射都需要这个非空覆盖逻辑,可直接全局配置,无需逐个映射添加:
public class MappingConfig { public static MapperConfiguration RegisterMaps() { return new MapperConfiguration(config => { // 全局应用非空成员条件 config.ForAllMaps((map, exp) => { exp.ForAllMembers(o => o.Condition((src, dest, srcMember) => srcMember != null)); // 同时处理反向映射 if (map.ReverseMap != null) { map.ReverseMap.ForAllMembers(o => o.Condition((src, dest, srcMember) => srcMember != null)); } }); // 只需定义映射,无需额外加条件 config.CreateMap<PermissaoEntity, PermissaoVO>().ReverseMap(); config.CreateMap<SystemCategoria, CategoriaVO>().ReverseMap(); }); } }
注意:全局配置会影响所有映射,若部分映射不需要该逻辑,建议使用前两种方案。
内容的提问来源于stack exchange,提问作者Guilherme Mohr
相关产品推荐
相关产品推荐

