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!

È stato utile?

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 su null , quindi nel getter MyPerson hai un se _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 ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top