使用AutoMapper时如何忽略无公开getter的目标类属性
AutoMapper忽略无公共Getter目标属性的解决方案
报错原因
AutoMapper解析opt => opt.nameSpecial这类属性选择lambda时,默认会访问属性的get访问器完成属性合法性校验,目标属性无对外可访问的get方法时就会触发该报错。
可行解决方案
方案1:使用属性名字符串重载(最推荐,无侵入性)
直接调用ForMember的字符串参数重载,按属性名匹配目标属性,无需通过lambda访问get方法,可直接绕过访问性校验:
.ForMember("nameSpecial", src => src.Ignore())
方案2:单独为映射规则启用非公共成员访问
如果该目标类存在多个类似的非公开访问属性,可以在创建该类的映射规则时,单独开启非公共成员访问权限:
// 源类型、目标类型替换为你实际的业务类型即可 CreateMap<SourceClass, TargetClass>(opt => opt.IncludeNonPublicMembers()) .ForMember(opt => opt.nameSpecial, src => src.Ignore());
方案3:全局调整属性映射校验规则
如果项目中大量存在无公共get方法的属性需要映射,可以全局修改AutoMapper的属性映射判定逻辑,只要属性存在可访问的set方法就纳入映射范围:
var mapperConfig = new MapperConfiguration(cfg => { // 调整规则:只要属性有公共set方法就视为可映射 cfg.ShouldMapProperty = prop => prop.SetMethod != null && prop.SetMethod.IsPublic; // 其余映射配置不变 cfg.CreateMap<SourceClass, TargetClass>() .ForMember(opt => opt.nameSpecial, src => src.Ignore()); });
注意:该方案会修改全局映射规则,调整前需评估对现有映射逻辑的影响。
内容的提问来源于stack exchange,提问作者Michael Wiles
相关产品推荐
相关产品推荐

