2013-10-08 26 views
1

這裏是I類在這個問題引用:如何使VB.Net功能參數一個強類型的屬性,而不是隻是一個字符串

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

在VB.NET類我有以下特性: 「通過的StackOverflow EDIT

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

加入:

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如下設定我在一個函數以後使用這個值:

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 

有沒有辦法使用屬性作爲傳遞給這個小功能的類型?

+0

如果Enums.Subscription是一個枚舉,你可以定義你的屬性'公共屬性OptionSelection()As Enums.Subscription' –

回答

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) 

和Y我們的功能則是:

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陣列中不存在的字符串,則會生成異常。所以你得到了一種商業邏輯類型的安全。

+0

非常感謝您的幫助和解釋! –

+0

你非常歡迎。我很高興這是你正在尋找的。 –

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")將是您的枚舉元素的字符串或數值等價值。如果表單提交值不匹配,那麼恐怕你被困住了。

+0

請在我原來的帖子中添加我的編輯,爲了清晰起見(我想我可能誤導了包括這個問題似乎取決於將原始輸入作爲字符串並轉向枚舉)。 –

+0

@JohnAdams我已經更新了我的答案,並重新閱讀了你的問題,我發現它不是真的回答你的問題'有沒有一種方法可以使用Property作爲傳遞給這個小函數的類型? 。 對於那個很抱歉!你不能真正把你的屬性作爲一種類型傳遞給你的函數......它不像Oracle那樣可以用表列的類型或類似的東西來定義存儲的proc參數。無論如何,我希望這有助於! –

相關問題