这是一个非常古老的话题,但是在这个后期阶段已经进入了我的视野,当我试图为只写属性做一个案例时,我想发表一些评论...
我有一组ActiveReport
类,这些类是网站的一部分,这些类在许多用户选择后都被实例化并在回发上运行。
VB代码如下所示:
Public Class SomeReport
Private greader As New GenericReporting.CommonReader("AStoredProcedure",
{New SqlParameter("budget_id", 0)})
Public WriteOnly Property BudgetID As Integer
Set(value As Integer)
greader.Parameters("budget_id").Value = value
End Set
End Property
Public Sub New(Optional budget_id As Integer = 0)
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
BudgetID = budget_id
End Sub
End Class
这些报告使用通用胆量,CommonReader
存储过程和默认值SqlParameter
s 的数组,每个都有一个关联的WriteOnly属性,根据报告设计的不同,这些属性可以在实例化时作为参数传递,或在实例化之前由用户设置调用报表Run
方法。
'''''''''''''''''''''''
' Parameter taken from a user selected row of a GridView
'
Dim SomeBudgetID As Integer = gvBudgets.SelectedDataKey.Values(budget_id)
'''''''''''''''''''''''
' On Instantiation
'
Dim R as ActiveReport = New SomeReport(SomeBudgetID)
R.Run()
'''''''''''''''''''''''
' Or On Instantiation using "With" syntax
'
Dim R as ActiveReport = New SomeReport() With {.BudgetID = SomeBudgetID}
R.Run()
'''''''''''''''''''''''
' Or After
'
Dim R as ActiveReport = New SomeReport()
R.BudgetID = SomeBudgetID
R.Run()
因此,正如我所见,在这种情况下具有只写属性
- 允许更强大的类型检查,因为
SqlParameter
s是泛型的
- 创建报告具有更大的灵活性,如果所有参数都可用,则可以立即实例化该报告,也可以在所有参数可用后再添加。
- 属性在实例化时支持“ With”语法
- 因为用户知道参数并且报告未更改参数,“ getter”是否真的必要?
- 由于
SqlParameter
s是类而不是原始值,因此WriteOnly属性允许使用更简单的接口来设置参数
这就是我的想法。
我可以将其转换为方法吗?可以,但是界面似乎...不太好
R2.BudgetID = SomeBudgetID
与
R2.SetBudgetID(SomeBudgetID)