0

Soo,我有一个组合框,它有一个自定义对象列表(“Person”类)作为数据源。我已将 Person.Name 映射为 DisplayMember,对象是选定的值。

当有人选择“鲍勃”人并按下选择人时,我想带走这个人,复制它,然后用复制品做事。

下面是解释它的代码:

 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 所建议的那样,我在 google 上添加了一些内容以找到克隆我的对象的正确方法

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

2 回答 2

2

解决此问题的标准方法是实现IClonable然后Clone()方法来创建对象的副本。然后在你的代码中,这样写:

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

基本问题是 Persons 是一个,因此是按引用而不是按值复制的。创建一个新的引用仍然指向同一个物理对象。

于 2013-11-10T04:18:03.190 回答
0

而不是这样做:

Dim newPerson as Person = p 

您需要为 编写一个复制构造函数Person,并执行以下操作:

Dim newPerson as New Person(p)
于 2013-11-10T04:15:57.197 回答