优雅的方式来限制字符串属性的可能值
问题描述:
我正在寻找一种更清晰的方式,而不是我将要介绍的限制字符串属性的可能值。假设我有一个属性“方向”一类优雅的方式来限制字符串属性的可能值
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”。
任何想法?
答
至于建议的Plutonix,你应该定义一个枚举:
Public Enum Direction
North
South
East
West
End Enum
您现在宣布你的财产作为类型。您几乎可以肯定已经使用了一些枚举,例如由ShowDialog
返回的DialogResult
以及MessageBox.Show
所使用的一些数字。您也可能在WinForms设计器中使用了一些编号,例如表格和控件的Dock
和Anchor
属性,的Style
属性和ComboBox
的DropDownStyle
。
请注意,数值由引擎盖下的数字表示 - Integer
默认值为零,并且调用ToString
的结果会给出您的名称。如果您需要名称以外的其他名称,例如你需要包含空格,然后你可以应用Description
属性并写一些简单的代码来获得它。
定义一个或多个枚举并且大多数验证代码可以消失 - 如果Direction prop是'As myEnum'则不需要验证。对于字符串表示,你可以使用'enumDirection.Tostring' – Plutonix 2014-10-07 21:53:36
啊,我知道'.ToString',但没有意识到它用Enums的方式工作。谢谢。我怀疑枚举是实现这一目标的方式,但我无法避免使用数字值。 – MattB 2014-10-07 22:18:11