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

使用AutoMapper时,如何在Lambda表达式中进行空值检查?

在AutoMapper的MappingProfile中处理空值检查的方法

我有如下映射配置类:

public class MappingProfile : Profile {

   public MappingProfile()
   {
       // DTO映射
       CreateMap<Animal, AnimalDto>()
        .ForMember(dest => dest.ReceivalDate, opt => opt.MapFrom(src => src.Receival.ReceivalDate));    
   }
}

问题在于Animal类中的Receival属性有时可能为null。我尝试以下两种写法均报错:

第一种写法:

src.Receival != null ? src.Receival.ReceivalDate : null

错误提示:

无法将lambda表达式转换为类型“IValueResolver<Animal, AnimalDto, object>”,因为它不是委托类型

第二种写法:

src?.Receival.ReceivalDate

错误提示:

表达式树lambda不得包含空传播运算符

请问在使用MappingProfile时,如何在Lambda表达式中进行空值检查?


可行的解决方法

方法1:显式指定null的类型

第一种写法报错的核心原因是编译器无法自动推断null的类型,导致lambda无法匹配MapFrom要求的委托类型。只需显式指定null的类型(与ReceivalDate的类型一致)即可解决:

CreateMap<Animal, AnimalDto>()
    .ForMember(dest => dest.ReceivalDate, 
        opt => opt.MapFrom(src => src.Receival != null ? src.Receival.ReceivalDate : (DateTime?)null));

假设ReceivalDate是可空的DateTime?类型,若为其他值类型,只需把(DateTime?)替换成对应可空类型即可。

方法2:使用自定义值解析器

如果空值检查逻辑更复杂,或者需要复用该逻辑,可以创建自定义的IValueResolver:

public class ReceivalDateResolver : IValueResolver<Animal, AnimalDto, DateTime?>
{
    public DateTime? Resolve(Animal source, AnimalDto destination, DateTime? destMember, ResolutionContext context)
    {
        return source.Receival?.ReceivalDate;
    }
}

然后在映射配置中引用这个解析器:

CreateMap<Animal, AnimalDto>()
    .ForMember(dest => dest.ReceivalDate, 
        opt => opt.MapFrom<ReceivalDateResolver>());

方法3:升级AutoMapper版本

如果你的AutoMapper版本较旧,升级到较新的版本(例如9.0及以上)后,表达式树会支持空传播运算符?.,此时你最初尝试的第二种写法src?.Receival.ReceivalDate就可以直接使用了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:25:25