如何全局配置AutoMapper以忽略映射中的特定属性
全局配置AutoMapper忽略特定属性的方案
当需要在所有AutoMapper映射中统一忽略某个属性(如SecretValue)时,无需逐个配置映射,以下几种方法可以实现全局规则:
方法1:通过Profile定义全局忽略规则
创建一个全局Profile类,在其中编写通用忽略逻辑,所有映射配置都会自动应用该规则:
public class GlobalIgnoreProfile : Profile { public GlobalIgnoreProfile() { // 遍历所有映射,自动忽略目标类型中的SecretValue属性(忽略大小写匹配) ForAllMaps((mapConfig, mappingExpr) => { var targetProp = mapConfig.DestinationType.GetProperty( "SecretValue", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); if (targetProp != null) { mappingExpr.ForMember(targetProp.Name, opt => opt.Ignore()); } }); } } // 注册全局Profile并添加其他映射 var mapperConfig = new MapperConfiguration(cfg => { cfg.AddProfile<GlobalIgnoreProfile>(); cfg.CreateMap<SourceEntity, DestinationDto>(); cfg.CreateMap<AnotherEntity, AnotherDto>(); });
方法2:用自定义特性标记需忽略的属性
如果需要更灵活的标记(比如多个不同属性都要忽略),可以自定义特性,再全局扫描应用:
// 自定义忽略特性 [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] public class IgnoreAutoMapAttribute : Attribute { } // 在DTO或实体的属性上标记 public class DestinationDto { [IgnoreAutoMap] public string SecretValue { get; set; } public string PublicValue { get; set; } } // 全局Profile中处理特性标记的属性 public class GlobalIgnoreProfile : Profile { public GlobalIgnoreProfile() { ForAllMaps((mapConfig, mappingExpr) => { var ignoreProps = mapConfig.DestinationType.GetProperties() .Where(prop => prop.GetCustomAttribute<IgnoreAutoMapAttribute>() != null); foreach (var prop in ignoreProps) { mappingExpr.ForMember(prop.Name, opt => opt.Ignore()); } }); } }
方法3:直接在MapperConfiguration中配置全局规则
如果不想创建Profile类,也可以直接在配置时添加全局逻辑:
var mapperConfig = new MapperConfiguration(cfg => { // 全局忽略SecretValue属性 cfg.ForAllMaps((mapConfig, mappingExpr) => { var targetProp = mapConfig.DestinationType.GetProperty("SecretValue"); if (targetProp != null) { mappingExpr.ForMember(targetProp.Name, opt => opt.Ignore()); } }); // 添加具体映射 cfg.CreateMap<SourceEntity, DestinationDto>(); cfg.CreateMap<ThirdEntity, ThirdDto>(); });
例外处理
如果某条映射需要跳过全局忽略规则,直接在该映射中显式配置即可覆盖全局设置:
cfg.CreateMap<SpecialEntity, SpecialDto>() .ForMember(dest => dest.SecretValue, opt => opt.MapFrom(src => src.SecretValue));
内容的提问来源于stack exchange,提问作者Azez salami
相关产品推荐
相关产品推荐

