2016-08-02 38 views
0

这是必须引用开放类的列表。将新对象添加到列表中时,以前添加的所有对象都将被覆盖

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循环的所有值以前添加到列表由最近添加类覆盖。

我试过了我在互联网上找到的所有解决方案并做了检查,该类不是静态的,而且我移除了每个被调用的静态方法和静态字段(只是为了确保),列表I已经创建,并且没有只读作为“对象”列表和“MyClass”列表。

有了:

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

而且具有:

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

所有'MyClass'实例引用相同的'Schedule'对象,所以每次有人将其'EmployeeData'财产,所有其他实例也受到影响 –

回答

0

那么,你是循环,并呼吁:

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,因为没有与它们相关的引用。所以string,int,long等可以像上面一样复制。

现在你可以这样做:

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

谢谢!我整天都在工作,看不到我的错误。谢谢!问题解决了。你刚刚救了我的一天。 –