AutoMapper 11 如何正确配置映射忽略目标类的索引器属性
AutoMapper 11 索引器属性映射校验失败解决方案
问题核心原因
AutoMapper 11 调整了默认映射规则,不再自动忽略C#索引器生成的带参Item属性,执行mapper.ConfigurationProvider.AssertConfigurationIsValid()校验时,会将该属性识别为未映射成员,直接抛出配置无效错误。
此前尝试的方案存在明确缺陷:
this.AddGlobalIgnore("Item")采用前缀匹配逻辑,会无差别忽略所有Item开头的自定义业务属性,存在误伤风险- 表达式语法
dest => dest[]/dest => dest[0]不符合ForMember的表达式参数规范,要么触发编译错误,要么被框架识别为子属性映射,无法命中索引器 - 传入字符串
"Item"调用ForMember时,框架默认查找无参的Item属性,和索引器生成的带参get_Item方法签名不匹配,会抛出Incorrect number of arguments supplied for call to method错误 ForAllMembers内判断属性名忽略的写法虽然能通过校验,但每个映射规则都要重复编写判断逻辑,冗余度高。
精准无副作用的解决方案
方案1:全局配置(推荐,零误伤)
直接在Profile中通过属性特征筛选索引器,仅忽略真正的索引器成员,完全不影响名称以Item开头的普通业务属性:
public class MapperProfile: Profile { public MapperProfile() { // 全局精准匹配所有索引器属性并忽略,和属性名前缀无关,无误伤风险 this.ForAllPropertyMaps( pm => pm.DestinationMember is PropertyInfo prop && prop.GetIndexParameters().Length > 0, (map, pm) => map.Ignore(pm.DestinationMember.Name) ); // 正常编写业务映射规则即可,无需额外处理索引器 CreateMap<Source, Target>(); } }
该规则的判断逻辑是检测属性是否携带索引参数,只有符合索引器特征的成员才会被忽略。
方案2:单映射粒度配置
如果不需要全局生效,只想为特定映射规则忽略索引器,可以直接在对应映射配置中通过成员条件匹配,无需使用ForAllMembers做全量遍历:
CreateMap<Source, Target>() .ForMember( dest => ((PropertyInfo)dest.DestinationMember).GetIndexParameters().Length > 0, opt => opt.Ignore() ) .ReverseMap();
该配置仅对当前Source -> Target的映射生效,不会影响其他映射规则。
注意:不要使用字符串传参的
ForMember("Item", opt => opt.Ignore())写法,该重载仅支持匹配无参属性,无法识别带参数的索引器成员,必然触发参数不匹配错误。
内容的提问来源于stack exchange,提问作者SJP
相关产品推荐
相关产品推荐

