优雅的方式来限制字符串属性的可能值

优雅的方式来限制字符串属性的可能值

问题描述:

我正在寻找一种更清晰的方式,而不是我将要介绍的限制字符串属性的可能值。假设我有一个属性“方向”一类优雅的方式来限制字符串属性的可能值

Public Class Location 
    Private _Direction As String 
    Public Property Direction() As String 
     Get 
      Return _Direction 
     End Get 
     Set(ByVal value As String) 
      _Direction = value 
     End Set 
    End Property 
End Class 

因此,假设我要限制方向的可能值,以“北”,“南”,“东”和“西”。我知道我可以做这样的事情:

Public Class Location 
    Private ValidDirection As New Collection 
    Public Sub New 
     ValidDirection.Add("1", "North") 
     ... 
    End Sub 
    Private _Direction As String 
    Public Property Direction() As String 
     Get 
      Return _Direction 
     End Get 
     Set(ByVal value As String) 
      If Me.ValidDirection.Contains(value) Then 
       _Direction = value 
      Else 
       Throw New Exception("Invalid direction.") 
      End If 
     End Set 
    End Property 
End Class 

但是如果我碰巧创造了大量的Location当时的我已经创建了一个集合了一遍又一遍。对于这个例子来说,这并不是什么大不了的事情,但假设我有5种或更多属性的25种可能性,并且我创建了数百或数千个Location,然后它开始累加起来。

有没有更好的方法来实现这一目标?

我还应该注意,以防万一它使事情复杂化,我想在某些情况下将输入转换为接受的值。例如,使用“N”,我想自动将其转换为“North”。

任何想法?

+1

定义一个或多个枚举并且大多数验证代码可以消失 - 如果Direction prop是'As myEnum'则不需要验证。对于字符串表示,你可以使用'enumDirection.Tostring' – Plutonix 2014-10-07 21:53:36

+0

啊,我知道'.ToString',但没有意识到它用Enums的方式工作。谢谢。我怀疑枚举是实现这一目标的方式,但我无法避免使用数字值。 – MattB 2014-10-07 22:18:11

至于建议的Plutonix,你应该定义一个枚举:

Public Enum Direction 
    North 
    South 
    East 
    West 
End Enum 

您现在宣布你的财产作为类型。您几乎可以肯定已经使用了一些枚举,例如由ShowDialog返回的DialogResult以及MessageBox.Show所使用的一些数字。您也可能在WinForms设计器中使用了一些编号,例如表格和控件的DockAnchor属性,的Style属性和ComboBoxDropDownStyle

请注意,数值由引擎盖下的数字表示 - Integer默认值为零,并且调用ToString的结果会给出您的名称。如果您需要名称以外的其他名称,例如你需要包含空格,然后你可以应用Description属性并写一些简单的代码来获得它。