目前,我将很多代码用于将字符串转换为数字并检查这些数字是否有效。所以我正在尝试创建一个简化此类的类。
我创建了两个扩展CType运算符,以简化将类分配给数字类型或字符串。但我遇到了一个问题。将Constrained数添加到对象集合时,不会调用这些CType运算符,因此会将实际的ConstrainedNumber对象添加到集合中。显然,数据库不支持这样的自定义类型。当类被强制转换为Object时,VBNet将不允许我创建一个CType运算符。
我需要的是一些导致编译器错误或警告的方法,如果它被强制转换为对象。是否有可以指定此内容的注释?或者更好的是,一种覆盖CType运算符的方法,以便我可以转换为对象?
以下是代码:
Friend Class ConstainedNumber(Of TNum As Structure)
Private Property _number As Object
Private Property _nDefaultValue As TNum
Private ReadOnly _nMax As Double
Private ReadOnly _nMin As Double
Private ReadOnly _bCanEqualMin As Boolean
Private ReadOnly _bCanEqualMax As Boolean
Public Function IsValid() As Boolean
Return IsValid(_number)
End Function
Private Function IsValid(value As Object) As Boolean
Return isValidNumber(value, _nMax, _nMin, _bCanEqualMax, _bCanEqualMin)
End Function
Public Property num As TNum
Get
Return If(IsValid, CType(_number, TNum), _nDefaultValue)
End Get
Set(value As TNum)
If IsValid(value) Then
_number = value
End If
End Set
End Property
Public Property str As String
Get
Return If(IsValid, _number.ToString, String.Empty)
End Get
Set(value As String)
If IsValid(value) Then
_number = Decimal.Parse(value)
End If
End Set
End Property
Public WriteOnly Property Val As Object
Set(value As Object)
If isValidObject(value) Then
str = value.ToString
End If
End Set
End Property
Public Sub New(defaultValue As TNum, nMax As Double, nMin As Double, Optional bCanEqualMax As Boolean = False, Optional bCanEqualMin As Boolean = False)
_nMax = nMax
_nMin = nMin
_bCanEqualMax = bCanEqualMax
_bCanEqualMin = bCanEqualMin
_nDefaultValue = defaultValue
num = defaultValue
End Sub
Public Function ToString() as String
Return str
End Function
Public Shared Widening Operator CType(ByVal value As ConstainedNumber(Of TNum)) As TNum
Return value.num
End Operator
Public Shared Widening Operator CType(ByVal value As ConstainedNumber(Of TNum)) As String
Return value.ToString()
End Operator
'//Here is the Issue. This CANNOT be done apparently.
Public Shared Widening Operator CType(ByVal value As ConstainedNumber(Of TNum)) As Object
Return value.num
End Operator
End Class
这是一个用法示例
Friend Class BasicSearchParams
Public Property sKeyword As String = String.Empty
Public ReadOnly dblLatitude As New ConstainedNumber(Of Double)(NoValueDouble, 90, -90, True, True)
Public ReadOnly dblLongitude As New ConstainedNumber(Of Double)(NoValueDouble, 180, -180, True, True)
Public ReadOnly dblPriceFrom As New ConstainedNumber(Of Double)(0, Double.MaxValue, 0)
Public ReadOnly dblPriceTo As New ConstainedNumber(Of Double)(0, Double.MaxValue, 0)
Public ReadOnly nListingsPerPage As New ConstainedNumber(Of Short)(1, 10000, 0) With {.Val = cGlobals.DefaultListingsPerPage}
Public ReadOnly nPictureWidth As New ConstainedNumber(Of Integer)(0, Short.MaxValue, 0)
Public ReadOnly nPictureHeight As New ConstainedNumber(Of Integer)(0, Short.MaxValue, 0)
End Class
我最初拥有的另一个目标,但似乎不可能,是将“num”作为默认属性而不使用参数。我尝试了下面的注释,但它不起作用。
<System.Reflection.DefaultMember("num")>