Automapper如何将字符串列表映射为含字符串属性的对象列表
问题原因
你最初的配置失效的核心原因是ReverseMap()无法自动反转自定义的成员转换逻辑:
你仅显式配置了Second -> First方向的ImportantList属性映射规则,调用ReverseMap()后,AutoMapper只会为First -> Second方向生成默认的映射逻辑:仅自动创建对应数量的ImportantListClass实例,但不知道需要将源端的string值赋值给目标实例的Name属性,因此出现Name全为null的问题。
解决方案
方案1:修改原映射配置,显式定义反向映射规则
如果不想单独配置类型转换,可以在原有配置基础上补充反向的属性映射逻辑:
CreateMap<Second, First>() .ForMember(dest => dest.ImportantList, opt => opt.MapFrom(src => src.ImportantList.Select(x => x.Name).ToList())) // 显式定义反向映射的属性规则 .ReverseMap() .ForMember(dest => dest.ImportantList, opt => opt.MapFrom(src => src.ImportantList.Select(x => new ImportantListClass { Name = x }).ToList()));
方案2:配置全局类型转换(更推荐)
就是你后续补充的实现方式,这种方案的优势是将string和ImportantListClass的转换逻辑全局复用,后续任意涉及这两个类型转换的场景都不需要再单独配置,代码更简洁易维护:
// 两个业务类的基础映射 CreateMap<First, Second>(); CreateMap<Second, First>(); // 配置双向类型转换器 CreateMap<ImportantListClass, string>() .ConvertUsing(source => source.Name); CreateMap<string, ImportantListClass>() .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src));
内容的提问来源于stack exchange,提问作者Mateusz Duda
相关产品推荐
相关产品推荐

