Automapper“IsNull”目标后缀无法正常工作

Posted

技术标签:

【中文标题】Automapper“IsNull”目标后缀无法正常工作【英文标题】:Automapper "IsNull" Destination postfix not working properly 【发布时间】:2019-04-13 02:17:07 【问题描述】:

我有以下代码:

  class Program

    static void Main(string[] args)
    
        var srcClass = new SourceClass  Value1 = null, Value2 = 10, Value3 = 20 ;
        Mapper.Initialize(cfg =>
        
            cfg.RecognizeDestinationPostfixes("IsNull");
            cfg.CreateMap<SourceClass, TargetClass>();
        );
        var targetClass = Mapper.Map<SourceClass, TargetClass>(srcClass);

    

public class SourceClass

    public int? Value1  get; set; 
    public int? Value2  get; set; 
    public int? Value3  get; set; 

public class TargetClass

    public bool Value1IsNull get; set; 
    public bool Value2IsNull  get; set; 
    public bool Value3IsNull  get; set; 

我希望 targetClass 实例具有以下值:true、false、false; 但我收到相反的结果:假,真,真。

如何解决这个问题?

【问题讨论】:

检查the execution plan。 您需要通过从 int 创建地图来告诉 AM 您想要什么?布尔值。 【参考方案1】:

这是因为当我们将整数转换为布尔值时,它会为 null 返回 false,为值返回 true。

            int? a;
            a = null;
            //Convert null to boolean
            bool a1 = Convert.ToBoolean(a);
            Console.WriteLine("Null Value - " + a1);
            a = 1;
            //Convert integer value to boolean
            a1 = Convert.ToBoolean(a);
            Console.WriteLine("Have Value - " + a1);
            var srcClass = new SourceClass  Value1 = null, Value2 = 1, Value3 = 20 ;
            Mapper.Initialize(cfg =>
            
                cfg.RecognizeDestinationPostfixes("IsNull");
                cfg.CreateMap<SourceClass, TargetClass>();
            );
            var targetClass = Mapper.Map<SourceClass, TargetClass>(srcClass);
            Console.WriteLine(targetClass.Value1IsNull+" - " +targetClass.Value2IsNull+" - " +targetClass.Value3IsNull);  

输出:

Null Value - False
Have Value - True
False - True - True

【讨论】:

以上是关于Automapper“IsNull”目标后缀无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

AutoMapper - 将源列表映射到目标数组

Automapper:忽略目标属性的验证异常

从源映射到现有目标时,AutoMapper 不会忽略 List

如何在 automapper 中为 aftermap 上的目标属性赋值

csharp Automapper - 多对象源和一个目标

如何防止 AutoMapper 覆盖目标对象上的现有值?