AutoMapper映射同名属性嵌套类与字符串属性时结果异常
AutoMapper嵌套对象映射到同名字符串属性结果不符的解决方法
问题原因
你遇到的问题是因为AutoMapper的ConstructUsing默认行为是先通过自定义方法创建目标实例,之后还会自动执行属性映射逻辑。也就是说,你在ConvertToB里手动设置了AnyName = a.AnyName.Parameter,但后续AutoMapper会自动将源对象的AnyName(NestedClass类型)映射到目标对象的同名字符串属性,而复杂类型转字符串默认会调用ToString()方法,最终得到类名"NestedClass",覆盖了你手动设置的值。
解决方案
有两种可靠的解决方式:
方式1:忽略指定属性的自动映射
在映射配置中,明确告诉AutoMapper不要自动处理AnyName属性,完全由自定义构造方法来赋值:
public class MainProfile : Profile { public MainProfile() { CreateMap<A, B>(MemberList.None) .ConstructUsing(x => ConvertToB(x)) .ForMember(dest => dest.AnyName, opt => opt.Ignore()); // 阻止AutoMapper自动映射该属性 } private B ConvertToB(A a) { return new B { AnyName = a.AnyName.Parameter, // 其他属性赋值 // ... }; } }
方式2:直接使用ForMember指定映射规则(推荐)
放弃使用ConstructUsing处理单个属性,改用AutoMapper标准的属性映射配置,这种方式逻辑更清晰,也避免了构造后自动映射的冲突:
public class MainProfile : Profile { public MainProfile() { CreateMap<A, B>(MemberList.None) .ForMember(dest => dest.AnyName, opt => opt.MapFrom(src => src.AnyName.Parameter)); // 其他属性的映射规则可以在这里依次添加 } }
验证效果
修改配置后运行你的示例代码,控制台会输出预期的123。
内容的提问来源于stack exchange,提问作者NET-Runner
相关产品推荐
相关产品推荐

