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

Mapster映射隐藏属性出现歧义匹配,如何配置解决?

解决Mapster映射子类隐藏父类属性的歧义匹配异常问题

问题场景

当子类使用new关键字隐藏父类同名属性时,Mapster在映射过程中会因反射无法确定要使用哪个属性,抛出AmbiguousMatchException。示例代码如下:

public static void Main()
{
    Console.WriteLine("Hello World");
    TypeAdapterConfig<B, ADto>.NewConfig().Map(dest => dest.Id, src => src.Id);
    var b = new B(){Id = 1};
    var aDto = b.Adapt<ADto>();
    Console.WriteLine(aDto.Id.ToString());
}

public class A
{
    public virtual long Id {get;set;}   
}

public class B : A
{
    public new int Id {get;set;}
}

public class ADto
{
    public int Id { get; set; }
}

解决方案:配置成员筛选规则,仅识别子类自身属性

通过Mapster的Filter方法,设置映射时仅选取当前源类型自身声明的成员,忽略父类同名属性,从根源避免歧义。

针对特定映射的配置

public static void Main()
{
    Console.WriteLine("Hello World");
    
    // 配置仅使用B类自身声明的属性
    TypeAdapterConfig<B, ADto>.NewConfig()
        .Map(dest => dest.Id, src => src.Id)
        .Filter((sourceType, member) => member.DeclaringType == sourceType);
    
    var b = new B(){Id = 1};
    var aDto = b.Adapt<ADto>();
    Console.WriteLine(aDto.Id.ToString()); // 输出1,无异常
}

全局配置(适用于所有类似场景)

如果多个类都存在子类隐藏父类属性的情况,可以配置全局规则:

// 全局设置,所有映射仅使用源类型自身声明的成员
TypeAdapterConfig.GlobalSettings.Default
    .Filter((sourceType, member) => member.DeclaringType == sourceType);

原理说明

Filter方法会过滤Mapster识别的成员,仅保留成员声明类型与源类型完全一致的属性。对于示例中的B类,只会选取B自身定义的Id属性,不会去匹配父类A中的同名属性,彻底避免反射时的歧义匹配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:35:20