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

