Soo,我有一个组合框,它具有自定义对象列表(“Person”类)作为数据源。我已将Person.Name映射为DisplayMember,对象是选定的值。
当有人选择“Bob”并按下ChoosePerson时,我想带这个人,复制它,并使用duplicata来做事情。
下面是解释它的代码:
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
答案 0 :(得分:2)
解决此问题的标准方法是实现IClonable
然后Clone()
方法来创建对象的副本。然后在你的代码中写下:
Dim p As Person= CType(cbPerson.SelectedValue, Person).Clone()
基本问题是人是一个类,因此通过引用而不是值复制。创建新引用仍指向同一物理对象。
答案 1 :(得分:0)
而不是这样做:
Dim newPerson as Person = p
您需要为Person
编写一个复制构造函数,并执行以下操作:
Dim newPerson as New Person(p)