将新对象添加到列表时,将覆盖以前已添加的所有对象

本文关键字:添加 对象 覆盖 列表 新对象 | 更新日期: 2023-09-27 18:00:02

这是必须引用打开类的列表。

readonly List<object> openedClasses = new List<object>();

这是我创建类和添加列表的地方。

var employees = myWs.ReturnListEmployee(guid);
foreach (Api.EmployeeData employee in employees)
{
     openedClasses.Add(new MyClass(pendingSchedules[0], employee));
}

我的类及其构造函数:

class MyClass
{
    public Schedule schedule;
    public MyClass(Schedule schedule, Api.EmployeeData employee)
    {
        // the "schedule.EmployeeData" it is constantly changed
        this.schedule = schedule;
        this.schedule.EmployeeData = employee;
    }
}

我的问题是:每次foreach循环,以前添加到列表中的所有值都会被最近添加的类覆盖。

我已经尝试了我在互联网上找到的所有解决方案,并进行了检查,该类不是静态的,我删除了对其调用的每个静态方法和静态字段(只是为了确保),我创建的列表中有和没有只读的"对象"列表和"MyClass"列表。

带有:

openedClasses.Add(new MyClass(pendingSchedules[0], employee));

与:

var myClass = new MyClass(pendingSchedules[0], employee);
openedClasses.Add(myClass);

将新对象添加到列表时,将覆盖以前已添加的所有对象

所以您正在循环并调用:

new MyClass(pendingSchedules[0], employee)

传递相同的对象pendingSchedules[0]。在构造函数中,您正在执行以下操作:

this.schedule.EmployeeData = employee;

其中this.schedule是相同的对象参考pendingSchedules[0]

您每次都在更改其员工,但引用保持不变

您可能只想在Schedule上创建一个Clone方法,以便每次都从同一引用创建一个新的引用,并将员工放在上面:

class Schedule
{
    public Schedule Clone()
    {
        return new Schedule
        {
             ValueType1 = this.ValueType1
        }
    }
}

注意:克隆的想法是断开引用,因此确保要分配给新Schedule引用的任何对象都以类似的方式断开。这就是为什么我说ValueType,因为没有与它们相关联的引用。所以stringintlong等可以像上面一样复制

现在你可以这样做了:

public MyClass(Schedule schedule, Api.EmployeeData employee)
{
    this.schedule = schedule.Clone();
    this.schedule.EmployeeData = employee;
}