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

使用Mapster映射CcmApplication至RpcCcmApplication时遇TypeLoadException

Mapster映射抛出TypeLoadException:方法体与声明签名不匹配的解决办法

问题场景

使用Mapster将CcmApplication对象映射为RpcCcmApplication对象时,出现如下异常:

TypeLoadException: Signature of the body and declaration in a method implementation do not match.  Type: 'GeneratedType_1'.  Assembly: 'Mapster.Dynamic, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.

当ICcmDeploymentType不实现ICcmSoftwareBase时,映射可正常执行。

问题根源

问题出在接口的多层继承关系与Mapster动态类型生成逻辑的冲突上:

  • ICcmDeploymentType继承了ICcmSoftwareBase,而ICcmApplication中的DeploymentTypes属性是IEnumerable<ICcmDeploymentType>类型
  • Mapster在动态生成映射代码时,无法正确解析这种接口层级下的类型转换规则,导致生成的方法签名与实际实现不匹配,触发TypeLoadException

解决方案

方案1:显式配置接口到目标类型的映射规则

通过Mapster的配置,明确指定接口对应的目标实现类型,让Mapster能正确生成映射代码:

public class Test
{
    private readonly IMapper _mapper = new Mapper(config =>
    {
        // 明确ICcmDeploymentType的映射目标为RpcCcmDeploymentType
        config.NewConfig<ICcmDeploymentType, RpcCcmDeploymentType>();
        // 可选:显式配置应用对象的映射规则
        config.NewConfig<CcmApplication, RpcCcmApplication>();
    });

    [Fact]
    public void FixedTest()
    {
        var app = new CcmApplication() { DeploymentTypes = new[] { new CcmDeploymentType() { Name = "Test" } } };
        var t = _mapper.Map<RpcCcmApplication>(app);
        Assert.NotNull(t);
        Assert.Equal("Test", t.DeploymentTypes?.FirstOrDefault()?.Name);
    }
}

方案2:调整接口继承结构(业务允许时)

如果业务逻辑不需要ICcmDeploymentType继承ICcmSoftwareBase,可以移除该继承关系,避免Mapster的类型解析冲突。但此方案仅适用于业务规则允许的场景。

验证

配置完成后,映射操作可正常执行,CcmApplication的属性能正确映射到RpcCcmApplication中。

内容的提问来源于stack exchange,提问作者cogumel0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:13:16