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

AutoMapper使用目标实体带参构造函数时忽略ForMember配置的问题求助

AutoMapper使用目标实体带参构造函数时忽略ForMember配置的问题求助

大家好,我之前在GitHub上提交的相关issue被关闭了,所以来这里开帖求助。我认为这明显是AutoMapper的行为bug,因为它直接导致了意料之外的错误,所以最开始我是在GitHub提的issue而非在这里提问。

源/目标类型

public class ModelA
{
    public string Text1 { get; set; }
    public string Text2 { get; set; }
}

public class ModelB
{
    public string Text1 { get; set; }
    public ModelB() { }
    public ModelB(string text1)
    {
        Text1 = text1;
    }
}

映射配置

public class ModelMappingProfile : Profile
{
    public ModelMappingProfile()
    {
        CreateMap<ModelA, ModelB>()
        // 这是我用来修复问题的临时方案
        //.ConstructUsing(_ => new ModelB())
        .ForMember(x => x.Text1, map => map.MapFrom(src => src.Text2));
    }
}

使用版本

AutoMapper 12.0.1

实际行为

AutoMapper会选用最匹配的构造函数,完全忽略我配置的ForMember规则。因为我不是目标实体的所有者,没办法修改这个模型本身,目前唯一的临时解决办法是手动通过ConstructUsing指定使用无参构造函数,这样之后AutoMapper才会正确应用我的ForMember配置。

复现步骤

我做了一个简化的示例来复现问题,逻辑和我实际复杂场景一致:

  • 按照上面的源/目标类型和映射配置编写代码
  • 执行ModelA到ModelB的映射操作,会发现ModelA.Text2并没有映射到ModelB.Text1,而是用了构造函数匹配的ModelA.Text1值

注:我实际的业务场景比这个示例复杂很多,只是用这个简单示例来描述问题本身,当然我并不是真的要做这类Text1和Text2的反向映射 😁

预期行为

我期望按照映射配置里的规则,把ModelA.Text2映射到ModelB.Text1。我觉得可以通过以下几种方案来修复这个问题:

  • AutoMapper选用最匹配的构造函数,但同时应用我配置的ForMember规则来赋值构造函数参数
  • AutoMapper只使用无参构造函数,然后按照常规逻辑执行映射
  • 至少AutoMapper可以抛出一个异常,提示我ForMember配置因为构造函数映射被完全忽略了

个人觉得前两种方案更符合AutoMapper的"最佳实践"处理逻辑,不过我主要希望这个问题本身能被解决。

备注:内容来源于stack exchange,提问作者Dominik Pfeifer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 07:49:35