VB.NET - автоматически инициализировать расширенное свойство типа Object - PullRequest
1 голос
/ 15 февраля 2012

Я создаю код за страницей, который имеет открытое свойство (MyDTOItem), которое, по сути, является объектом DTO (dtDTOItem). Примечание. В моем коде Get и Set на самом деле представляют собой реальный код (я выделил его для примера).

Проблема, с которой я столкнулся, заключается в событии Page_Load.Когда я устанавливаю свойство .Member1 объекта DTO, запускается код Get, а не Set, и поэтому свойство ibject DTO .Member1 никогда не назначается.

Я понял, что если я добавлю код (MyDTOItem = New dtDTOItem) к событию Page_Load, то это значение будет правильно установлено.Я пытаюсь выяснить, как инициализировать объект свойства без необходимости делать это явно.Это должно быть расширенное свойство, потому что у меня есть собственный код Get и Set.

Заранее спасибо.

Public Property MyDTOItem As dtDTOItem
    Get

    End Get
    Set(value As dtDTOItem)

    End Set
 End Property


<DataContract(), Serializable()> _
Public Class dtDTOItem

  <DataMember()> _
  Property Member1 As String = ""

  <DataMember()> _
  Property Member2 As String = ""

  <DataMember()> _
  Property Member3 As String = ""

End Class


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    MyDTOItem.Member1 = "temp string"
End Sub

1 Ответ

1 голос
/ 15 февраля 2012

Вы должны создать экземпляр поля, которое поддерживает ваше свойство MyDTOItem, прежде чем пытаться задать для него значения свойства.Вы не можете обманывать и не создавать объект до того, как начнете связываться с его членами.

Пример:

Приватное oBackingField As SomeObject = New SomeObject

Открытое свойство VisiblePropertyКак SomeObject Get

End Get .... и т. Д.

Нет событий.Ну ... это, вероятно, сработает для события Init или PreInit ... но вам не нужно беспокоиться об этом.

EDIT 2

До .NET 4 вам приходилосьобработайте все свои свойства с помощью полей поддержки, и даже по сей день, если вы предоставляете средства доступа к свойствам, вы должны предоставить свое собственное поле поддержки ... это выглядело так:

Private backingField As DataType = New DataType  ' Create backing field and initialize it

Public Property forwardFacingProperty As DataType
Get
  Return backingField
End Get
Set (byval tValue as DataType)
  backingField = tValue
End Set
End Property
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...