2012-02-15 59 views
1

我正在構建一個具有公共屬性(MyDTOItem)的本質上是DTO對象(dtDTOItem)的代碼注意:在我的代碼中,Get和Set實際上是實際的代碼(我爲例子剝離了它)。VB.NET - 自動初始化對象類型的擴展屬性

我遇到的問題是在Page_Load事件中。當我設置DTO對象的.Member1屬性時,Get代碼運行,而不是Set,因此DTO ibject屬性.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

您必須在嘗試設置屬性值之前實例化支持您的MyDTOItem屬性的字段。在開始搞亂其成員之前,你不會欺騙,也不會安裝對象。

例子:

私人oBackingField作爲SomeObject =新SomeObject

公共財產VisibleProperty作爲SomeObject 獲取

最終獲取 ....等

沒有參與事件。那麼..它可能適用於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 
+0

你推薦哪個事件我在做? – wavedrop 2012-02-15 17:51:32

+0

有趣的是,如果我使用自動屬性,那麼我可以創建我的實例: – wavedrop 2012-02-15 17:55:10

+0

Public Property MyDTOItem As dtDTOItem = New dtDTOItem的作品,但只要我擴展屬性,我不會「欺騙」,必須創建某個地方的對象。 – wavedrop 2012-02-15 17:55:50