Automapper映射带私有setter属性时配置ForMember仍赋值失败怎么办
问题原因
- 核心配置错误:你当前创建的是
IDbCoverage到ICoverage接口的映射规则,但实际映射的目标类型是实现了ICoverage的Coverage类,AutoMapper不会自动将接口层面的映射规则应用到其实现类上,导致你针对CoverageCodeDesc的配置完全未生效。 - AutoMapper默认仅映射公共可写属性,私有setter的属性默认不会被自动纳入映射范围,需要额外配置。
修复方案
方案1:直接配置到具体实现类的映射规则
这是最直接的修复方式,显式指定源到Coverage类的映射:
var config = new MapperConfiguration(cfg => { cfg.CreateMap<IDbCoverage, Coverage>() .ForMember(dest => dest.CoverageCodeDesc, conf => conf.MapFrom(src => src.CoverageCodeDesc)); // 如果你的业务中需要通过ICoverage接口作为映射目标,新增下面的配置即可,AutoMapper会自动解析到Coverage实现类 cfg.CreateMap<IDbCoverage, ICoverage>().As<Coverage>(); });
方案2:全局开启私有setter属性映射支持
如果项目中有大量带私有setter的属性需要映射,可以修改全局规则避免重复配置:
var config = new MapperConfiguration(cfg => { // 全局允许带私有setter的公共属性参与映射 cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || (p.SetMethod != null && (p.SetMethod.IsPrivate || p.SetMethod.IsFamily)); cfg.CreateMap<IDbCoverage, Coverage>() .ForMember(dest => dest.CoverageCodeDesc, conf => conf.MapFrom(src => src.CoverageCodeDesc)); cfg.CreateMap<IDbCoverage, ICoverage>().As<Coverage>(); });
内容的提问来源于stack exchange,提问作者Sperick
相关产品推荐
相关产品推荐

