Mapster中非可空数值类型的0值忽略方案咨询
Mapster忽略非可空数值类型默认值的解决方案
你遇到的问题是Mapster的IgnoreNullValues(true)仅忽略null值,不会处理非可空值类型的默认值(比如int的0)。要实现忽略源对象中值为默认值的属性,可通过以下几种方式解决:
1. 全局配置(所有值类型生效)
在全局设置中添加规则,忽略源对象中值为对应类型默认值的属性:
C cat = new C() { Age = 8 }; C cat2 = new C() { Id = 2, Name = "Jana", Age = 20 }; TypeAdapterConfig.GlobalSettings.Default.IgnoreNullValues(true); // 新增规则:忽略源端值为类型默认值的属性 TypeAdapterConfig.GlobalSettings.Default.IgnoreMember((member, side) => side == MemberSide.Source && member.Type.IsValueType && Equals(member.GetValue(), Activator.CreateInstance(member.Type))); var output = cat.Adapt(cat2);
该配置会对所有值类型生效,只要源属性值是对应类型的默认值(如int的0、bool的false等),就不会覆盖目标属性的值。
2. 针对特定类型配置
如果只需要对C类生效,可单独配置:
C cat = new C() { Age = 8 }; C cat2 = new C() { Id = 2, Name = "Jana", Age = 20 }; TypeAdapterConfig<C, C>.NewConfig() .IgnoreNullValues(true) .IgnoreMember((member, side) => side == MemberSide.Source && member.Type.IsValueType && Equals(member.GetValue(), Activator.CreateInstance(member.Type))); var output = cat.Adapt(cat2);
3. 针对单个属性配置
如果仅需忽略特定属性(比如Id)的默认值,可单独映射该属性:
C cat = new C() { Age = 8 }; C cat2 = new C() { Id = 2, Name = "Jana", Age = 20 }; TypeAdapterConfig<C, C>.NewConfig() .IgnoreNullValues(true) // 当源Id为0时,保留目标原有值 .Map(dest => dest.Id, src => src.Id == 0 ? dest.Id : src.Id); var output = cat.Adapt(cat2);
以上方案均可实现你的需求:映射后output的Id保持为2,Name保持为"Jana",Age被替换为8。
内容的提问来源于stack exchange,提问作者MrJahanbin
相关产品推荐
相关产品推荐

