Pergunta

Estou tendo problemas com, como eu disse, definindo a propriedade de uma propriedade. Vamos dizer que eu tenho uma classe que representa uma transação. Na minha classe eu tenho uma propriedade que representa uma outra classe, como este:

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

Então eu basicamente tem uma propriedade que tem um filtro get que recebe a pessoa apropriada. O problema é que quando eu quiser definir informações da Pessoa através da propriedade, VB parece ignorar que eu mesmo fiz isso, como esta:

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

Mas quando eu colocar um relógio no presente, depois de definir a propriedade, o meu valor não muda. Estou intrigado com esse comportamento. Existe algo que eu estou fazendo errado? Obrigado!

Foi útil?

Solução

Cada vez que você faz um .MyPerson get, o Person.GetAppropriatePerson função é chamada.

Eu não sei a implementação dessa função, mas eu acho que ele retorna uma nova pessoa objeto de cada vez que ele é chamado.

Você pode alterar o nome de uma instância Pessoa. A próxima vez que você chamar .MyPerson, outra instância pessoa fica retornado.

Dependendo de como isto é suposto para trabalhar, você pode fazer algumas coisas, por exemplo:

  • GetAppropriatePerson chamada no construtor (se personid é conhecido na época). Atribuir o valor de retorno para _myPerson, e tornar a propriedade MyPerson somente leitura.
  • Ou _myPerson initialize para null, em seguida, no MyPerson getter Tem um if _myPerson == null Then _myPerson = GetAppropriatePerson etc.

Outras dicas

Eu não sei se é uma cópia n colar de erro, mas você parece estar substituindo _myPerson cada vez na parte Get da propriedade. Isso seria mais do que provável causa o seu "Alguns Nome" para obter substituído: -)

Editar do'h, codeape diz a mesma coisa segundos antes de mim: -)

Um padrão comum para inicialização preguiçosa de imóveis como este é fazer algo como o seguinte, que verifica se o objeto é nulo antes de o substituir.

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

Você teria que mudar sua inicialização _myPerson ser um dim _myPerson as Person reta, em vez de dim _myPerson as New Person() demasiado

Deve-se ficar alteradas por esta linha: _myPerson = Person.GetAppropriatePerson (Me.PersonID)

passo através de você código ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top