Impossible de définir la propriété de la propriété
-
06-07-2019 - |
Question
J'ai des problèmes avec, comme je l'ai dit, la définition de la propriété d'un bien immobilier. Disons que j'ai une classe qui représente une transaction. Dans ma classe, j'ai une propriété qui représente une autre classe, comme celle-ci:
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
Donc, j'ai essentiellement une propriété qui a un filtre get qui obtient la personne appropriée. Le problème est que lorsque je veux définir les informations de la personne par le biais de la propriété, VB semble ignorer que je l’ai même fait, comme ceci:
Me.myPersonRecord.Person.Name = "Some Name"
Mais quand je mets un oeil dessus, après avoir défini la propriété, ma valeur ne change pas. Je suis intriguée par ce comportement. Y a-t-il quelque chose que je fais mal? Merci!
La solution
Chaque fois que vous obtenez un .MyPerson
, la fonction Person.GetAppropriatePerson
est appelée.
Je ne connais pas l'implémentation de cette fonction, mais je suppose qu'elle renvoie un nouvel objet Personne chaque fois qu'il est appelé.
Vous modifiez le nom d'une instance de personne. La prochaine fois que vous appelez .MyPerson
, une autre instance de personne est renvoyée.
En fonction de la manière dont cela est supposé fonctionner, vous pouvez effectuer quelques opérations, par exemple:
- Appelez
GetAppropriatePerson
dans le constructeur (si personid est connu à ce moment-là). Attribuez la valeur de retour à_myPerson
et rendez la propriétéMyPerson
en lecture seule. - Ou initialisez
_myPerson
ànull
, puis, dans leMyPerson
, obtenez unsi _myPerson == null Alors _myPerson = GetAppropriatePerson etc. .
Autres conseils
Je ne sais pas s'il s'agit d'une erreur de copier / coller, mais vous semblez écraser _myPerson
à chaque fois dans la partie Get de la propriété. Cela provoquerait plus que probablement votre " Quelque nom " pour être écrasé: -)
modifier Faites, codeape dit la même chose quelques secondes avant moi: -)
Un modèle courant pour l’initialisation paresseuse de propriétés comme celle-ci consiste à effectuer les opérations suivantes, qui vérifient si l’objet est null avant de l’écraser.
Public Property MyPerson as Person
Get
If _myPerson Is Nothing Then
_myPerson = Person.GetAppropriatePerson(Me.PersonID)
End If
return _myPerson
End Get
Vous devez modifier votre initialisation _myPerson
pour qu'elle soit un dim _myPerson en tant que personne
direct, plutôt que dim _myPerson en tant que nouvelle personne ()
aussi
Il doit être modifié par cette ligne: _myPerson = Person.GetAppropriatePerson (Me.PersonID)
parcourez votre code ...