我正在尝试使用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,因为我没有初始化它?
答案 0 :(得分:2)
在C#中integers
是value 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.
}