AutoMapper中Array转List映射失败,配置后仍提示未映射属性求助
解决AutoMapper中Array转List的未映射属性问题
你遇到的问题其实是两个细节导致的:一是重复创建了Mapper配置且校验的是未包含正确规则的实例,二是源和目标属性名不匹配,AutoMapper无法自动识别映射关系。下面一步步帮你解决:
问题根源拆解
- 配置冲突:你先用
Mapper.Initialize定义了包含映射规则的全局配置,但随后又新建了一个完全独立的MapperConfiguration,这个新实例里的CreateMap没有添加ForMember规则,对它执行AssertConfigurationIsValid()自然会抛出未映射的异常。 - 属性名不匹配:你的
Origin类属性叫array,Destination类属性叫list,属性名不一样,AutoMapper没办法自动匹配,必须显式指定映射关系。
修正后的可运行代码
using AutoMapper; using System; using System.Collections.Generic; namespace PocArrayListMap { class Destination { public List<string> list = new List<string>(); } class Origin { public string[] array; } class Program { static void Main(string[] args) { // 创建唯一的Mapper配置,包含正确的映射规则 var config = new MapperConfiguration(cfg => { cfg.CreateMap<Origin, Destination>() .ForMember(dest => dest.list, opt => opt.MapFrom(src => src.array)); // 注意:AutoMapper会自动把string[]转换成List<string>,不需要手动调用ToList() }); config.AssertConfigurationIsValid(); // 现在校验可以通过 var mapper = config.CreateMapper(); var o = new Origin() { array = new string[] { "one", "two", "three" } }; var d = mapper.Map<Destination>(o); Console.WriteLine(string.Join(", ", d.list)); // 输出:one, two, three } } }
额外注意事项
- AutoMapper 6.x及以上版本,推荐使用
MapperConfiguration创建IMapper实例,而不是依赖全局的Mapper静态类,这样配置更清晰,也方便后续做单元测试。 - 如果源和目标的属性名完全一致,AutoMapper会自动处理数组和
List<T>之间的转换,不需要额外写规则;只有属性名不同时,才需要用ForMember指定映射关系。
内容的提问来源于stack exchange,提问作者JP Hellemons
相关产品推荐
相关产品推荐

