You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:12:09