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

时间:2016-08-02 14:05:08

标签: c# .net list overwrite

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

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

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

的列表

使用:

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

并且:

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

1 个答案:

答案 0 :(得分:0)

所以你在循环和调用:

new MyClass(pendingSchedules[0], employee)

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

this.schedule.EmployeeData = employee;

其中this.schedule是同一个对象引用pendingSchedules[0]

每次您都在更改员工,但参考保持不变

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

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;
}