Pregunta

Estoy teniendo problemas con, como dije, establecer la propiedad de una propiedad. Digamos que tengo una clase que representa una transacción. En mi clase tengo una propiedad que representa otra clase, como esta:

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

Entonces, esencialmente tengo una propiedad que tiene un filtro get que obtiene la persona adecuada. El problema es que cuando quiero configurar la información de la Persona a través de la propiedad, VB parece ignorar que incluso lo hice, como este:

Me.myPersonRecord.Person.Name = "Some Name"

Pero cuando observo esto, después de configurar la propiedad, mi valor no cambia. Estoy desconcertado por este comportamiento. ¿Hay algo que estoy haciendo mal? Gracias!

¿Fue útil?

Solución

Cada vez que obtiene un .MyPerson , se llama a la función Person.GetAppropriatePerson .

No conozco la implementación de esa función, pero supongo que devuelve un nuevo objeto Person cada vez que se llama.

Cambia el nombre de una instancia de persona. La próxima vez que llame a .MyPerson , se devolverá otra instancia de Person.

Dependiendo de cómo se supone que funciona, podría hacer algunas cosas, por ejemplo:

  • Llame a GetAppropriatePerson en el constructor (si se conoce personid en ese momento). Asigne el valor de retorno a _myPerson y haga que la propiedad MyPerson sea de solo lectura.
  • O inicialice _myPerson en null , luego en el getcode MyPerson tenga un si _myPerson == null Entonces _myPerson = GetAppropriatePerson, etc. .

Otros consejos

No sé si se trata de un error de copiar y pegar, pero parece que está sobrescribiendo _myPerson cada vez en la parte Obtener de la propiedad. Es muy probable que eso cause su " Algún nombre " para sobrescribirse :-)

editar do'h, codeape dice lo mismo segundos antes que yo :-)

Un patrón común para la inicialización diferida de propiedades como esta es hacer algo como lo siguiente, que verifica si el objeto es nulo antes de sobrescribirlo.

Public Property MyPerson as Person
Get
    If _myPerson Is Nothing Then
        _myPerson = Person.GetAppropriatePerson(Me.PersonID)
    End If
    return _myPerson
End Get

Tendrías que cambiar tu inicialización de _myPerson para que sea un dim _myPerson como persona , en lugar de dim _myPerson como nueva persona () también

Debe ser modificado por esta línea: _myPerson = Person.GetAppropriatePerson (Me.PersonID)

paso a través de su código ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top