2

我正在尝试使用 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 因为我没有初始化它?

4

2 回答 2

2

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

因此,有了这些信息,您的员工的财产价值是:

e1 { E1 = 7, E2 = 0 }

e2 { E1 = 0, E2 = 78 }

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

e1 { E1 = 0, E2 = 78 }

所以你的代码工作得很好。因为值类型除非被装箱,否则永远不能为空,因此您的条件将始终返回 true。

于 2013-10-19T08:53:53.293 回答
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.               

        }
于 2013-10-19T09:01:44.013 回答