No se puede establecer la propiedad de la propiedad
-
06-07-2019 - |
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!
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 propiedadMyPerson
sea de solo lectura. - O inicialice
_myPerson
ennull
, luego en el getcodeMyPerson
tenga unsi _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 ...