0

そうです、データソースとしてカスタム オブジェクト ("Person" クラス) のリストを持つコンボ ボックスがあります。Person.Name を DisplayMember にマップしました。オブジェクトは選択された値です。

誰かが「Bob」の人を選択して ChoosePerson を押したとき、私はこの人を取り、それを複製し、その複製を使用して何かをしたいと考えています。

それを説明するコードは次のとおりです。

 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 に追加する「ボブ」人物が 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 がclassであるため、値ではなく参照によってコピーされることです。新しい参照を作成しても、同じ物理オブジェクトを指します。

于 2013-11-10T04:18:03.190 に答える