我看到很多关于 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);
}
但仍然无法解释为什么它不适用于这种情况。