2011-01-29 4 views
0

私はこのようなプログラムを持っています。各ループの内部のオブジェクトを変更すると、最後の値を持つすべてのオブジェクトのプロパティが設定されます

Module Module1 

Public Class Mstr 
    Public Property Prop1 As String 
    Public Property Prop2 As String 
    Public Property Prop3 As String 
    Public Property Prop4 As String 

    Public Property lstDtlsA As List(Of DtlsA) 
    Public Property DtlsB As DtlsB 
End Class 


Public Class DtlsA 
    Public Property Prop1 As String 
    Public Property Prop2 As Integer 
    Public Property Prop3 As String 
    Public Property Prop4 As Integer 

    Public Property DtlsB As DtlsB 
End Class 

Public Class DtlsB 
    Public Property Prop1 As String 
    Public Property Prop2 As Integer 
    Public Property Prop3 As String 
    Public Property Prop4 As Integer 
End Class 

Private Sub Process(ByVal mstr As Mstr) 
    Dim lstTemp As New List(Of DtlsA) 

    For Each dtl In mstr.lstDtlsA 
     'Do some processing 
     PopulateDtlsBForDtlsA(mstr, dtl) 
     lstTemp.Add(dtl) 
    Next 

    'Finally set the modified dtls list to mstr 
    mstr.lstDtlsA = lstTemp 
End Sub 

Sub PopulateDtlsBForDtlsA(ByVal mstr As Mstr, ByVal dtl As DtlsA) 
    Dim dtlB As New DtlsB 

    dtlB = mstr.DtlsB 
    dtlB.Prop1 = mstr.Prop1 
    dtlB.Prop2 = dtl.Prop2 
    dtlB.Prop4 = dtl.Prop4 
    dtl.DtlsB = dtlB 
End Sub 

Sub Main() 
    Dim mstr As New Mstr 
    mstr.Prop1 = "Master Property 1" 
    mstr.Prop2 = "Master Property 2" 
    mstr.Prop3 = "Master Property 3" 
    mstr.Prop4 = "Master Property 4" 

    mstr.lstDtlsA = New List(Of DtlsA) 
    Dim dtlA As DtlsA 

    dtlA = New DtlsA 
    dtlA.Prop1 = "Detail A Property 11" 
    dtlA.Prop2 = 12 
    dtlA.Prop3 = "Detail A Property 13" 
    dtlA.Prop4 = 12 
    mstr.lstDtlsA.Add(dtlA) 

    dtlA = New DtlsA 
    dtlA.Prop1 = "Detail A Property 21" 
    dtlA.Prop2 = 22 
    dtlA.Prop3 = "Detail A Property 23" 
    dtlA.Prop4 = 24 
    mstr.lstDtlsA.Add(dtlA) 

    dtlA = New DtlsA 
    dtlA.Prop1 = "Detail A Property 31" 
    dtlA.Prop2 = 32 
    dtlA.Prop3 = "Detail A Property 33" 
    dtlA.Prop4 = 34 
    mstr.lstDtlsA.Add(dtlA) 

    Dim dtlB As New DtlsB 

    dtlB.Prop1 = "Detail B Property 1 set by master" 
    dtlB.Prop3 = "Detail B Property 3 set by master" 
    mstr.DtlsB = dtlB 

    Process(mstr) 
End Sub 

エンドモジュール

しかし、私はそれが期待するとして、それが機能していません。 Quickwatch while debugging

3つのDtlsAオブジェクトすべてのDtlsBプロパティは、最後の反復の値を持っています。私がここで間違っていることを私に教えてください。コンセプトについての少しの説明も非常に役に立つでしょう。ありがとう!!!

答えて

0

あなたはここに同じオブジェクトを再利用し、変異されています

dtlB = mstr.DtlsB 

をする代わりに、完全に新しいオブジェクトまたは既存の1のクローンを作成し、既存のオブジェクトを使用します。

関連する問題