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
相关产品推荐
相关产品推荐

