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

