AutoMapper Map Int

时间:2013-10-19 04:00:13

标签: c# automapper

我正在尝试使用AutoMapper,除了int属性之外它完美地工作,因为它只是用0替换字段

代码:

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,因为我没有初始化它?

2 个答案:

答案 0 :(得分:2)

在C#中integersvalue types /数字结构。每个值类型都有一个隐式默认构造函数,用于初始化该类型的默认值。 integers的默认值为zero。因此,即使您没有在代码中显式初始化它们,默认构造函数也会将其设置为零。

因此,通过此信息,您的员工的财产价值为:

e1 { E1 = 7, E2 = 0 }

e2 { E1 = 0, E2 = 78 }

现在,当您将 e2 映射到 e1 时(这是故意这样做的吗?) e1 将变为:

e1 { E1 = 0, E2 = 78 }

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

答案 1 :(得分: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.               

        }