C# 自动映射非空属性

C# 自动映射非空属性,c#,automapper,C#,Automapper,有没有一种方法可以在以下条件下使用Automapper将Src映射到Dest: -如果Src的Num为null,则Dest的Num属性应保持不变 -如果Src的InnerStr为null,则Dest的Num属性应保持不变 -如果Src的InnerStr不能被解析为int,那么Dest的Num应该保持不变 -如果Src的InnerStr可以解析为int,那么Dest的Num的值应该设置为该值 对象示例: public Dest { public int? Num{ get; set; } }

有没有一种方法可以在以下条件下使用Automapper将Src映射到Dest: -如果Src的Num为null,则Dest的Num属性应保持不变 -如果Src的InnerStr为null,则Dest的Num属性应保持不变 -如果Src的InnerStr不能被解析为int,那么Dest的Num应该保持不变 -如果Src的InnerStr可以解析为int,那么Dest的Num的值应该设置为该值

对象示例:

public Dest
{
   public int? Num{ get; set; }
}

public Src
{
   public InnerObject Num { get; set; }
}

public InnerObject
{
   public string InnerStr { get; set; }
}
以下是我所尝试的:

Mapper.CreateMap<InnerObject, int?>()
   .ConvertUsing(src => 
             { 
                 int x = 0; 
                 //need help here. I'm not sure how to get the source's value at
                 //this point
                 return (int.TryParse(src.Text, out x)) ? new int?(x) : src'svalue; 
             });

Mapper.CreateMap<Src, Dest>();
Mapper.CreateMap()
.ConvertUsing(src=>
{ 
int x=0;
//这里需要帮助。我不知道如何获取源的值
//这一点
返回(int.TryParse(src.Text,out x))?新的int?(x):src的值;
});
CreateMap();
。。。 测试:

Dest myDestObj = new Dest()
   {
      Num = new int?(2);
   };

Src nullSrcObj = null;
Src nullStringObj = new Src()
   {
      Num = null;
   };
Src cantBeParsedObj= new Src()
   {
      Num = "I'm not an int!";
   };
Src mySrcObj = new Src()
   {
      Num = "123";
   };

//Should be 2
Console.WriteLine(myDestObj.Num)

Mapper.Map<Src, Dest>(nullSrcObj, myDestObj);

//Should be 2
Console.WriteLine(myDestObj.Num);

Mapper.Map<Src, Dest>(nullStrObj, myDestObj);

//Should be 2
Console.WriteLine(myDestObj.Num);

Mapper.Map<Src, Dest>(cantBeParsedObj, myDestObj);


//Should be 2
Console.WriteLine(myDestObj.Num);

Mapper.Map<Src, Dest>(mySrcObj, myDestObj);


//Should be 123
Console.WriteLine(myDestObj.Num);
Dest myDestObj=new Dest()
{
Num=新的int?(2);
};
Src nullSrcObj=null;
Src nullStringObj=新的Src()
{
Num=null;
};
Src cantBeParsedObj=新的Src()
{
Num=“我不是int!”;
};
Src mySrcObj=新的Src()
{
Num=“123”;
};
//应该是2
Console.WriteLine(myDestObj.Num)
Map(nullSrcObj,myDestObj);
//应该是2
Console.WriteLine(myDestObj.Num);
Mapper.Map(nullStrObj,myDestObj);
//应该是2
Console.WriteLine(myDestObj.Num);
Mapper.Map(cantbepassedobj,myDestObj);
//应该是2
Console.WriteLine(myDestObj.Num);
Map(mySrcObj,myDestObj);
//应该是123
Console.WriteLine(myDestObj.Num);

我认为以下代码正是您想要的

            Mapper.CreateMap<Src, Dest>().ForMember(d => d.Num, expression => expression.ResolveUsing(src =>
            {
                if (src.Num == null)
                {
                    return null;
                }
                else
                {
                    int value;
                    if (int.TryParse(src.Num.InnerStr, out value))
                    {
                        return value;
                    }
                    else
                    {
                        return null;
                    }
                }
            }));
Mapper.CreateMap().formMember(d=>d.Num,expression=>expression.ResolveUsing(src=>
{
如果(src.Num==null)
{
返回null;
}
其他的
{
int值;
if(int.TryParse(src.Num.InnerStr,out值))
{
返回值;
}
其他的
{
返回null;
}
}
}));

如果src.Num为null,我希望目标值保持不变,而不是用null覆盖。如果无法解析src中的值,则相同。