2013-10-19 76 views
2

我试图使用AutoMapper和它完美的作品,除了INT性质,因为它只是取代了场0AutoMapper地图诠释

代码:

public class Employee 
{ 
    public int E1 { get; set; } 
    public int E2 { get; set; } 
} 

Mapper.CreateMap<Employee, Employee>().ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull)); 

Employee e1 = new Employee {E1 = 7}; 
Employee e2 = new Employee {E2 = 78}; 

Mapper.Map(e2, e1); 

// //结果E1 = 0,E2 = 78 ....它是否应该只映射E2和 离开E1,因为我没有初始化它?

回答

1

自动映射器似乎将零设置为未初始化的整数属性。所以你看到目标对象的E1是零(0)。 E2已被正确映射。

我试着设置AutoMapper忽略未初始化的属性,它给了我想要的结果。

 [TestMethod] 
     public void Test() 
     { 
      Employee e1 = new Employee { E1 = 7 }; 
      Employee e2 = new Employee { E2 = 78 }; 

      Mapper.CreateMap<Employee, Employee>().ForMember(x => x.E1, x => x.Ignore()); 
      var de1 = Mapper.Map<Employee, Employee>(e2, e1); 

      //de1.E1 is 7.    

     } 
2

在C#integersvalue types /数字结构。每个值类型都有一个默认的默认构造函数,用于初始化该类型的默认值。 integers的默认值为zero。所以即使你没有在你的代码中明确地初始化它们,默认的构造函数也会将它设置为零。

所以用这个信息员工的属性值:

E1 { E1 = 7, E2 = 0 }

E2 { E1 = 0, E2 = 78 }

现在,当你映射e2E1(这是故意做?)E1将变为:

E1 { E1 = 0, E2 = 78 }

所以,你的代码工作完全正常。由于值类型不能为null,除非它们被装箱,否则您的条件将始终返回true。