2016-08-02 33 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

謝謝!我整天都在工作,看不到我的錯誤。謝謝!問題解決了。你剛剛救了我的一天。 –