VB.NET - 自动初始化对象类型的扩展属性
问题描述:
我正在构建一个具有公共属性(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
答
您必须在尝试设置属性值之前实例化支持您的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
你推荐哪个事件我在做? – wavedrop 2012-02-15 17:51:32
有趣的是,如果我使用自动属性,那么我可以创建我的实例: – wavedrop 2012-02-15 17:55:10
Public Property MyDTOItem As dtDTOItem = New dtDTOItem的作品,但只要我扩展属性,我不会“欺骗”,必须创建某个地方的对象。 – wavedrop 2012-02-15 17:55:50