2013-11-10 97 views
0

很好,我有一個組合框,它有一個自定義對象(「Person」類)的列表作爲數據源。我已將Person.Name映射爲DisplayMember,並且該對象是所選的值。複製一個類實例

當有人選擇一個「鮑勃」人並按下ChoosePerson時,我想把這個人,複製它,並使用duplicateata做東西。

繼承人的代碼來解釋它:

Private Sub ChoosePerson_Click(sender As Object, e As EventArgs) Handles ChoosePerson.Click 
    Dim p As Person= CType(cbPerson.SelectedValue, Person) 
    MyChosenList.Add(ChoseAPerson(m)) 
    cbPerson.SelectedIndex() = 0 
End Sub 

Private function ChoseAPerson(byval p as Person) as Person 
    Dim newPerson as Person = p 
    newPerson.name = "ANewPerson_" & p.Name 
    Return newPerson 
End function 

現在,如果我回到我的組合框cbPerson,我選擇較早(BOB)的人都會有它的名字替換爲「ANewPerson_bob」

我如何確保添加到myChosenList中的「bob」人是Person類的不同實例?

編輯

我補充偵察一點上谷歌找到做我的對象的克隆正確的方式@dotNET建議它

Public Function Clone() As Object Implements ICloneable.Clone 
    Return DirectCast(MemberwiseClone(), Person) 
End Function 

回答

2

解決此問題的標準方法是實現IClonable,然後使用Clone()方法創建對象的副本。然後在你的代碼,這樣寫:

Dim p As Person= CType(cbPerson.SelectedValue, Person).Clone() 

的基本問題是,人是類,因此被複制引用而不是價值。創建一個新的參考仍然指向相同的物理對象。

+0

你的正式我的新的最好的朋友,如果這個工程,我馬上試試! –

+0

太棒了,這個效果很好,淺層克隆就是我需要的atm。非常感謝。 –

0

不是這樣:

Dim newPerson as Person = p 

您需要編寫一個Person的複製構造函數,並執行此操作:

Dim newPerson as New Person(p) 
+0

urk ...人類是...巨大的......這將是一個痛苦的寫下來...但如果我沒有其他選擇,我猜 –