2013-11-10 61 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 ...人类是...巨大的......这将是一个痛苦的写下来...但如果我没有其他选择,我猜 –