foreach集合引用类型嵌套属性更新

时间:2013-08-20 19:34:56

标签: c#-4.0 collections types foreach

我看到了关于foreach集合引用类型属性更新的大量示例,但不是我正在努力解决的问题。如果要更新引用类型项的属性的属性,该怎么办?像这样:

 public class Employee
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public EmployeeType EmpType { get; set; }
    }

    public class EmployeeType
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class Class1
    {
        private IList<Employee> existingEmp;

        public void edit()
        {
            var dbEmployees = GetExistingEmployees();

            IList<Employee> employees = new List<Employee> { 
                new Employee{ Id = 1, Name="me", EmpType = new EmployeeType { Id = 1}}, 
                new Employee{ Id = 2, Name="me again", EmpType = new EmployeeType { Id = 2}}
            };

            foreach (var emp in employees)
            {
                foreach (var oldEmp in dbEmployees)
                {
                    if (emp.Id == oldEmp.Id)
                    {
                        UpdateChanges(emp, oldEmp);
                        existingEmp.Add(oldEmp);
                    }
                }
            }
        }        

        private void UpdateChanges(Employee emp, Employee oldEmp){
            if (oldEmp.EmpType.Id != emp.EmpType.Id)
            {
                LogChange();
                oldEmp.EmpType.Id = emp.EmpType.Id;
            }
        }

        private void LogChange()
        {
            throw new NotImplementedException();
        }

        //data access layer
        public IList<Employee> GetExistingEmployees()
        {
            throw new NotImplementedException();
        }
    }

如果他/她的员工类型属性Id在ddl中更改,则此处的问题是集合中的最后一个员工,更新它将级联到集合中的所有其他员工的emp类型。这是坚果。由于日志记录要求,我不能使用lambda或其他花哨的构造。我需要用在foreach或for循环中修复它。“

编辑:

正如所料,相同的代码结构在我的应用程序中的其他位置工作。我没有得到最后一项的属性更新流血到其他项目的属性。

我使用hacky方法解决了这个问题:

private void UpdateChanges(Employee emp, Employee oldEmp){
    var oldEmpTemp = GetEmployeeById(oldEmp.Id);

    if (oldEmp.EmpType.Id != emp.EmpType.Id)
    {
        LogChange();
        oldEmpTemp.EmpType.Id = emp.EmpType.Id;
    }
    //instead of updating the collection items
    // and bulk updating in the db, update directly in the db
    UpdateEmployee(oldEmpTemp);    
}

但仍然无法解释为什么它不适合这个实例。

0 个答案:

没有答案