Вопрос

Как я уже сказал, у меня возникли проблемы с настройкой свойства свойства.Допустим, у меня есть класс, представляющий транзакцию.В моем классе есть свойство, представляющее другой класс, например:

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

Итак, по сути, у меня есть свойство с фильтром get, который получает подходящего человека.Проблема в том, что когда я хочу установить информацию о человеке через свойство, VB, кажется, игнорирует даже то, что я это сделал, например:

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

Но когда я на это смотрю, после установки свойства мое значение не меняется.Я озадачен таким поведением.Что-то я делаю не так?Спасибо!

Это было полезно?

Решение

Каждый раз, когда вы делаете получение .MyPerson, функция Person.GetAppropriatePerson позвонят.

Я не знаю реализации этой функции, но предполагаю, что она возвращает новый объект Person каждый раз, когда ее вызывают.

Вы меняете имя одного экземпляра Person.В следующий раз, когда ты позвонишь .MyPerson, возвращается другой экземпляр Person.

В зависимости от того, как это должно работать, вы можете сделать несколько вещей, например:

  • Вызов GetAppropriatePerson в конструкторе (если personid известен на тот момент).Присвойте возвращаемое значение _myPerson, и сделайте MyPerson свойство доступно только для чтения.
  • Или инициализировать _myPerson к null, то в MyPerson у добытчика есть if _myPerson == null Then _myPerson = GetAppropriatePerson etc.

Другие советы

Я не знаю, является ли это ошибкой копирования и вставки, но вы, похоже, перезаписываете _myPerson каждый раз в части Get свойства. Это, скорее всего, приведет к тому, что у вас появится "Some Name" переписать: -)

edit до'х, codeape говорит то же самое за несколько секунд до меня: -)

Обычный шаблон для отложенной инициализации таких свойств - выполнить что-то вроде следующего, которое проверяет, является ли объект нулевым, перед его перезаписью.

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

Вам нужно изменить инициализацию _myPerson на прямую dim _myPerson как Person , а не dim _myPerson как New Person () тоже

Это должно быть изменено этой строкой: _myPerson = Person.GetAppresponPerson (Me.PersonID)

пошагово просматривайте код ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top