2016-08-02 8 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ループの前にリストに追加されたすべての値は、最も最近追加されたクラスによって上書きされます。

私はインターネット上で見つけたすべてのソリューションを試してみました。クラスは静的ではなく、静的メソッドと静的フィールドをそれぞれ削除しました。 "オブジェクト"のリストと "MyClass"のリストとして読み込み専用の有無で作成しました。

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

とと::で

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

すべて 'インスタンスは同じ' Schedule'オブジェクトを参照しているので、毎回誰かがその 'EmployeeData'プロパティを設定MyClass'、他のすべてのインスタンスは、あまりにも –

答えて

0

だから、ループと呼んでいる:

new MyClass(pendingSchedules[0], employee) 

周りに同じオブジェクトpendingSchedules[0]を渡します。 this.schedulependingSchedules[0]

同じオブジェクトの参照であり、あなたはそれが毎回従業員だが、参照はあなただけかもしれ同じ

のまま変更されている

this.schedule.EmployeeData = employee; 

:コンストラクタでは、これをやっていますScheduleCloneメソッドを作成して、同じ参照から毎回新しい参照を作成し、従業員をその上に置くようにします。

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

影響を受けていますありがとうございました!私は一日中働いていて、私の間違いを見ることができませんでした。ありがとうございました!問題は解決されました。あなたは私の日を救っただけです。 –

関連する問題