2009-06-22 5 views
2

Je rencontre des problèmes avec, comme je l'ai dit, la définition de la propriété d'une propriété. 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 ceci:Impossible de définir la propriété de la propriété

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 

ont donc je essentiellement une propriété qui a un filtre get qui obtient la personne appropriée. Le problème est que quand je veux mettre l'information de la personne à travers la propriété, VB semble ignorer que je même l'ai fait, comme ceci:

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

Mais quand je mets une montre sur ce point, après avoir défini la propriété , ma valeur ne change pas. Je suis intrigué par ce comportement. Y a-t-il quelque chose que je fais de mal? Merci!

Répondre

4

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 j'imagine qu'elle renvoie un nouvel objet Person 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.

Selon la façon dont cela est censé fonctionner, vous pouvez faire quelques petites choses, par exemple:

  • Appel GetAppropriatePerson dans le constructeur (si personid est connu à ce moment-là). Affectez la valeur de retour à _myPerson et définissez la propriété MyPerson en lecture seule.
  • Ou initialiser _myPerson à null, puis dans le MyPerson getter ont une if _myPerson == null Then _myPerson = GetAppropriatePerson etc.
+1

Ah, je vois ce que vous dites. Cependant, je ne vois aucun moyen de contourner cela, sauf si je supprime le getter et que j'utilise une fonction chaque fois que je veux obtenir le nom de client approprié de la propriété. – Austin

+0

Que diriez-vous de l'option deux ci-dessus? Voir la réponse par @Dan F pour un exemple complet de ce à quoi devrait ressembler votre propriété MyPerson. – codeape

+0

Hey, ça a marché!Je ne peux pas croire que je n'ai pas pensé à faire l'instruction simple if pour vérifier un null. Merci! – Austin

7

Je ne sais pas si c'est une erreur de pâte de n copie, mais vous semblez remplacerez _myPerson chaque fois dans la partie Get de la propriété. Cela plus susceptible de causer votre « un nom » pour obtenir :-) écrasé

modifierdo'h, codeape dit les mêmes secondes chose avant moi :-)

Un modèle commun pour paresseux L'initialisation de propriétés de ce type consiste à faire quelque chose comme ce qui suit, qui vérifie si l'objet est nul 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 devriez changer votre initialisation _myPerson être une dim _myPerson as Person droite, plutôt que dim _myPerson as New Person() trop

+0

Merci! J'apprécie l'aide, mais codeape vient d'arriver en premier;) Cependant, il est rassurant que j'utilise un modèle que je n'ai même pas réalisé. Je me suis toujours demandé comment l'initialisation paresseuse était utilisée. – Austin

+0

Pas de soucis, heureux que cela ait aidé :-) –

1

Il faut se changer par cette ligne: _myPerson = Person.GetAppropriatePerson (Me.PersonID) Passez votre code ...

Questions connexes