如何在AutoMapper中实现单次映射时忽略指定属性
解决AutoMapper单次映射忽略指定属性的问题
嘿,我之前也碰到过一模一样的需求——全局映射已经在多处跑起来了,但某些场景下得临时忽略某个属性,又不想动全局配置。给你两个实用的方案:
方案一:单次映射时传入临时配置(最推荐)
AutoMapper的Map方法有重载支持传入MappingOperationOptions,能在单次映射时临时修改规则,完全不会影响全局配置。代码示例:
// 仅本次映射忽略CreatedDateTime属性 var destObject = Mapper.Map<DestModel>(sourceObject, opt => opt.ForMember(dest => dest.CreatedDateTime, cfg => cfg.Ignore()) );
这个方法最灵活,适合只需要偶尔忽略的场景,写起来也简洁。
方案二:创建命名映射(适合重复使用的场景)
如果你的业务里有多处需要忽略这个属性的场景,可以在全局初始化时创建一个命名映射,之后调用时指定这个名称即可:
首先在全局配置里添加命名映射:
Mapper.Initialize(cfg => { // 保留原有的全局默认映射 cfg.CreateMap<SourceModel, DestModel>(); // 创建一个命名映射,专门用于需要忽略CreatedDateTime的场景 cfg.CreateMap<SourceModel, DestModel>("IgnoreCreatedDateTime") .ForMember(x => x.CreatedDateTime, opt => opt.Ignore()); });
然后在需要的地方调用这个命名映射:
var destObject = Mapper.Map<SourceModel, DestModel>(sourceObject, "IgnoreCreatedDateTime");
这样就不用每次都写重复的临时配置,代码更整洁。
为什么你之前的方法不行?
你之前直接重新定义CreateMap<SourceModel, DestModel>().ForMember(...)会覆盖全局的映射规则,导致所有场景都忽略该属性。而上面的两种方法都是基于原有全局配置做的扩展,只会影响指定的单次或命名映射,完美解决你的问题。
内容的提问来源于stack exchange,提问作者Vishwakant
相关产品推荐
相关产品推荐

