VBNet。转换运算符无法转换为对象。如何限制转化为对象?

时间:2015-06-06 00:21:33

标签: vb.net generics

目前,我将很多代码用于将字符串转换为数字并检查这些数字是否有效。所以我正在尝试创建一个简化此类的类。

我创建了两个扩展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")>

0 个答案:

没有答案