Impossibile impostare la proprietà della proprietà
-
06-07-2019 - |
Domanda
Ho problemi con, come ho detto, l'impostazione della proprietà di una proprietà. Diciamo che ho una classe che rappresenta una transazione. Nella mia classe ho una proprietà che rappresenta un'altra classe, come questa:
Public Class PersonRecord
_myPerson = new Person()
Public Property MyPerson as Person
Get
_myPerson = Person.GetAppropriatePerson(Me.PersonID)
return _myPerson
End Get
Set
_myPerson = value
End Set
End Property
Quindi essenzialmente ho una proprietà che ha un filtro get che ottiene la persona appropriata. Il problema è che quando voglio impostare le informazioni della persona attraverso la proprietà, VB sembra ignorare che l'ho fatto anche io, come questo:
Me.myPersonRecord.Person.Name = "Some Name"
Ma quando lo metto sotto controllo, dopo aver impostato la proprietà, il mio valore non cambia. Sono perplesso da questo comportamento. C'è qualcosa che sto facendo di sbagliato? Grazie!
Soluzione
Ogni volta che ottieni .MyPerson
, viene chiamata la funzione Person.GetAppropriatePerson
.
Non conosco l'implementazione di quella funzione, ma immagino che restituisca un nuovo oggetto Person ogni volta che viene chiamato.
Modifica il nome di un'istanza di una persona. La prossima volta che chiami .MyPerson
, viene restituita un'altra istanza Person.
A seconda di come dovrebbe funzionare, potresti fare alcune cose, ad esempio:
- Chiama
GetAppropriatePerson
nel costruttore (se personid è noto in quel momento). Assegna il valore restituito a_myPerson
e rendi la proprietàMyPerson
di sola lettura. - O inizializza
_myPerson
sunull
, quindi nel getterMyPerson
hai unse _myPerson == null Quindi _myPerson = GetAppropriatePerson ecc .
Altri suggerimenti
Non so se si tratta di un errore di copia e incolla, ma sembra che si stia sovrascrivendo _myPerson
ogni volta nella parte Ottieni della proprietà. Ciò avrebbe più che probabilmente causato il tuo "Nome" " per essere sovrascritto :-)
modifica do'h, codeape dice la stessa cosa pochi secondi prima di me :-)
Un modello comune per l'inizializzazione pigra di proprietà come questa è fare qualcosa di simile al seguente, che controlla se l'oggetto è nullo prima di sovrascriverlo.
Public Property MyPerson as Person
Get
If _myPerson Is Nothing Then
_myPerson = Person.GetAppropriatePerson(Me.PersonID)
End If
return _myPerson
End Get
Dovresti cambiare la tua _myPerson
per essere una dim _myPerson come Persona
anziché dim _myPerson come Nuova persona ()
troppo
Deve essere modificato da questa riga: _myPerson = Person.GetAppropriatePerson (Me.PersonID)
passa in rassegna il tuo codice ...