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

AutoMapper多场景条件映射出现对象引用错误问题问询

问题原因

你遇到的空引用报错和AutoMapper预条件功能无关,本质是三目运算表达式中没有做空值安全处理:当条件判断后访问关联对象路径时,只要路径中任意一层对象为null(比如DataProcessing为null、GridCollect为null等),就会直接抛出空引用异常。
拆分字段写法不会报错的原因是AutoMapper对单个MapFrom的关联路径会默认做隐性的空值兼容处理,而合并到三目表达式中后,该隐性兼容会失效,需要你手动做空值校验。

可行方案

方案1:直接加空值条件运算符(最简便)

使用C#的空值条件运算符?.修饰关联路径的每一层,避免空引用,代码如下:

public class DepositsVm : IMapFrom<Deposits>
{
    public long DepId { get; set; }
    public AddressDto Address { get; set; }
    public void Mapping(Profile profile)
    {
        profile.CreateMap<Deposits, DepositsVm>()
            .ForMember(d => d.DepId, s => s.MapFrom(s => s.DepId))
            .ForMember(d => d.Address, opt => opt.MapFrom(s => 
                s.ProcessingId != null 
                    ? s.DataProcessing?.GridCollect?.Grid?.Address 
                    : s.Reduction?.DataCollect?.Tower?.Address
            ));
    }
}

你需要提前完成Address到AddressDto的映射配置,AutoMapper会自动完成嵌套类型的转换,无需额外处理。

方案2:抽取公共逻辑(适合多场景复用)

如果该地址获取逻辑需要在多个地方使用,可以把判断逻辑抽取为实体的扩展方法或者只读属性,映射代码更简洁易维护:
首先定义扩展方法:

public static class DepositsExtension
{
    public static Address GetValidAddress(this Deposits deposit)
    {
        if (deposit.ProcessingId != null)
        {
            return deposit.DataProcessing?.GridCollect?.Grid?.Address;
        }
        return deposit.Reduction?.DataCollect?.Tower?.Address;
    }
}

映射时直接调用即可:

.ForMember(d => d.Address, opt => opt.MapFrom(s => s.GetValidAddress()))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:18:05