Невозможно установить свойство свойства
-
06-07-2019 - |
Вопрос
Как я уже сказал, у меня возникли проблемы с настройкой свойства свойства.Допустим, у меня есть класс, представляющий транзакцию.В моем классе есть свойство, представляющее другой класс, например:
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)
пошагово просматривайте код ...