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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:22:35