1

这是我在这个问题中引用的课程:

Public Class Enums
    Public Enum Subscription As Byte
        Vendor = 1
        FreeTrial = 2
        Standard = 3
        Enterprise = 4
    End Enum
End Class

在 VB.NET 类中,我具有以下属性:

Private _optionSelection1 As String                            'added by StackOverflow EDIT 
Public Property OptionSelection() As String
    Get
        Return If(IsNothing(_optionSelection1), String.Empty, _optionSelection1)
    End Get
    Set(ByVal value As String)
        _optionSelection1 = value
    End Set
End Property

该属性从 Request.Form 变量中设置如下:'由 StackOverflow 编辑添加

    Me.OptionSelection = HttpContext.Current.Request.Form("option_selection1")   'added by StackOverflow EDIT 

我稍后在函数中使用此值:

Dim choiceMade As Enums.Subscription = SubscriptionOptionSelected(Me.OptionSelection)

我认为如果它的参数可以比字符串“更强”,函数可能会更强大:

Private Function SubscriptionOptionSelected(ByVal value As String) As Enums.Subscription
Select Case value
    Case "S10"
        Return Enums.Subscription.Standard
    Case "ENT"
        Return Enums.Subscription.Enterprise
End Select
End Function

我尝试编写如下函数,但编译器立即抱怨:

 Private Function SubscriptionOptionSelected(ByVal value As OptionSelection) As Enums.Subscription

有没有办法使用 Property 作为传递给这个小函数的类型?

4

2 回答 2

2

你问的是多余的。OptionSelection 是一个字符串,您正在调用的函数将字符串作为输入。通过说你希望type参数的 是property你说你希望一个字符串是一个字符串。

现在,如果该字符串具有某些需要应用到它以成为有效字符串的业务逻辑,那么您需要创建一个可以包含该业务逻辑的类:

Public Class OptionSelection
    Private _OptionString As String
    Private _validStrings As String() = New String() {"S10", "ENT"}

    Public Sub New(Optional ByVal AnOption As String = "S10")
        If _validStrings.Contains(AnOption) Then
            _OptionString = AnOption
        Else
            Throw New Exception("Value must be in the list of acceptable strings")
        End If
    End Sub

    Public Property OptionSelection() As String
        Get
            Return _OptionString
        End Get
        Set(ByVal value As String)
            If _validStrings.Contains(value) Then
                _OptionString = value
            Else
                Throw New Exception("Value must be in the list of acceptable strings")
            End If
        End Set
    End Property

    Public Shared Narrowing Operator CType(ByVal input As String) As OptionSelection
        Return New OptionSelection(input)
    End Operator
End Class

然后您的属性更改为:

Private _optionSelection1 As OptionSelection
Public Property OptionSelection() As OptionSelection
    Get
        Return _optionSelection1
    End Get
    Set(ByVal value As OptionSelection)
        _optionSelection1 = value
    End Set
End Property

您的作业更改为:

Me.OptionSelection = CType(HttpContext.Current.Request.Form("option_selection1"),OptionSelection)

然后你的功能是:

Private Function SubscriptionOptionSelected(ByVal value As OptionSelection) As    Enums.Subscription
    Select Case value.OptionSelection
        Case "S10"
            Return Enums.Subscription.Standard
        Case "ENT"
            Return Enums.Subscription.Enterprise
    End Select
End Function

所有这些代码为您所做的就是允许您强制执行将哪种字符串存储在OptionSelection. 您可以通过将它们包含在数组中来扩展允许的字符串_validStrings

如果您的应用程序尝试分配数组中不存在的字符串,_validStrings则会生成异常。所以你得到了一种业务逻辑类型的安全性。

于 2013-10-08T20:53:14.617 回答
0

将您的属性定义为 Enums.Subscription 而不是 String。另一种方法是用于Enum.TryParse()验证输入SubscriptionOptionSelected并在解析失败时抛出异常。这是作为枚举的属性的示例,尽管如果 的唯一目的SubscriptionOptionSelected是将字符串解析为枚举值,那么它就不再是必需的了。

Private _optionSelection1 As Enums.Subscription
Public Property OptionSelection() As Enums.Subscription
    Get
        Return _optionSelection1
    End Get
    Set(ByVal value As String)
        _optionSelection1 = value
    End Set
End Property

Private Function SubscriptionOptionSelected(ByVal value As Enums.Subscription) As Enums.Subscription
...
End Function

这是一个使用 Enum.TryParse 代替的示例...

Private Function SubscriptionOptionSelected(ByVal value As String) As Enums.Subscription
    Dim retVal As Enums.Subscription
    If Not System.Enum.TryParse(Of Enums.Subscription)(value, retVal) Then
        '   Deal with invalid value... throw Exception maybe?
    End If
    Return retVal
End Function

因此,在您的代码中(基于您的更新),您可以将您的属性更改为枚举并执行以下操作:

Me.OptionSelection = Me.SubscriptionOptionSelected(HttpContext.Current.Request.Form("option_selection1"))

这假定 的值Form("option_selection1")将是您的 Enum 元素的字符串或数字等效值。如果表单提交值不匹配,那么恐怕你会被困在原样做事。

于 2013-10-08T18:41:32.657 回答