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

AutoMapper v11(.NET6)如何忽略所有Null值且避免调用目标set方法?

问题

使用AutoMapper v11(C# .NET6)时,希望忽略所有字段的Null值(不进行映射),示例代码如下:

class SrcExample
{
    public string? Name { get; set; }
    public int? Age { get; set; }
}

class DestExample
{
    public string Name { get; set; }
    public int Age { get; set; }
}

var map = CreateMap<SrcExample, DestExample>();
map.ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));

尝试使用opts.Condition忽略Null值,但该方法仅对string类型有效。对于**int?**类型,srcMember的值为0而非null,AutoMapper似乎将int的默认值作为srcMember的值。需要了解该行为的原因,以及如何让AutoMapper在源值为Null时完全忽略映射、避免调用目标类的set方法。

原因分析

出现这个问题的核心原因是AutoMapper对可空值类型的处理逻辑:当你使用srcMember参数时,AutoMapper会自动对可空值类型(如int?)执行拆箱操作,将其转换为对应的非可空值类型(int)。如果源属性的int?值为null,拆箱后就会返回int的默认值0,导致你的srcMember != null条件永远为true,无法跳过映射。

而string?作为引用类型,拆箱后仍然保留null值,所以条件判断有效。

解决方案

要实现“源值为Null时完全忽略映射、不调用目标set方法”的需求,可以利用AutoMapper提供的ResolutionContext中的IsSourceValueNull属性,它能直接判断源属性的原始值是否为null,不受拆箱操作影响。

修改映射配置如下:

var map = CreateMap<SrcExample, DestExample>();
map.ForAllMembers(opts => opts.Condition((src, dest, srcMember, context) => !context.IsSourceValueNull));

原理说明

  • context.IsSourceValueNull会直接检查源属性的原始值是否为null,对于int?类型的null值,该属性会返回true,从而让Condition条件不满足,跳过当前成员的映射。
  • 这种方式不会触发目标类的set方法,完全符合需求。

如果需要更精细化的控制(比如针对特定类型调整逻辑),也可以通过反射直接获取源对象的属性值进行判断:

map.ForAllMembers(opts => opts.Condition((src, dest, srcMember, context) => 
{
    if (context.MemberMap.SourceMember is not PropertyInfo sourceProp)
        return true;
    
    var sourceValue = sourceProp.GetValue(src);
    return sourceValue != null;
}));

这种方式通过反射直接读取源对象的属性原始值,避免AutoMapper的自动拆箱干扰,同样能实现需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:40:33