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

When adding a new object to the list all the objects already added previously are overwritten

这是必须引用开放 classes 的列表。

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

这是我创建 classes 并添加列表的地方。

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

我的class及其构造函数:

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 循环之前添加到列表中的所有值都被最近添加的值覆盖 class。

我已经尝试了我在互联网上找到的所有解决方案并进行了检查,class 不是静态的,我删除了调用它的每个静态方法和静态字段(只是为了确保),我创建的列表有和没有只读列表 "object" 和 "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;
}