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

Automapper 6.6.2 可空布尔值映射异常问题求助

解决AutoMapper中可空布尔值映射到自定义可空对象的问题

我懂你遇到的困扰了——当源对象的bool?值为null时,AutoMapper直接把目标对象里的IsEnabled(应该是个自定义的可空包装类吧?)设为null,但你希望的是IsEnabled本身是一个实例,只是它的Value属性为null对吧?

先明确下类的定义(你没贴全,我补一下合理的结构):

public class Source
{
    public bool? IsEnabled { get; set; }
}

public class Dest
{
    public MyNullableBool IsEnabled { get; set; }
}

public class MyNullableBool
{
    public bool? Value { get; set; }
}

问题根源在于:AutoMapper默认对引用类型的映射逻辑是——如果源值为null,就直接把目标成员设为null,不会主动创建目标对象的实例。而你需要的是不管源值是否为null,都要创建MyNullableBool的实例,并把源值赋给它的Value属性。

这里有两种简单的解决办法:


方法一:在Source到Dest的映射中显式指定

直接在映射配置里告诉AutoMapper如何生成目标的IsEnabled成员:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Source, Dest>()
        .ForMember(dest => dest.IsEnabled, opt => opt.MapFrom(src => 
            new MyNullableBool { Value = src.IsEnabled }));
});

这样不管src.IsEnabled是null还是具体的true/false,都会生成一个MyNullableBool实例,把值传给Value属性。


方法二:创建通用的类型映射(推荐)

如果这个bool?到MyNullableBool的映射在项目中会多次用到,可以单独定义这个类型的映射规则,AutoMapper会自动复用:

var config = new MapperConfiguration(cfg =>
{
    // 先定义bool?到MyNullableBool的映射
    cfg.CreateMap<bool?, MyNullableBool>()
        .ConstructUsing(src => new MyNullableBool { Value = src });
    
    // 再定义Source到Dest的映射,AutoMapper会自动应用上面的规则
    cfg.CreateMap<Source, Dest>();
});

验证效果

用你的测试代码跑一下:

var mapper = config.CreateMapper();
var source = new Source { IsEnabled = null };
var dest = mapper.Map<Dest>(source);

Console.WriteLine(dest.IsEnabled != null); // 输出 True,说明实例已创建
Console.WriteLine(dest.IsEnabled.Value.HasValue); // 输出 False,说明Value是null

这样就完全符合你的预期了——dest.IsEnabled不会是null,只有它的Value属性为null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:38:15