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

时间:2014-10-07 21:39:10

标签: vb.net properties

我正在寻找一种比我要呈现的更清晰的方式来限制字符串属性的可能值。假设我有一个具有“Direction”属性的类

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 s,那么我就一遍又一遍地创建了这个集合。对于这个例子来说,这不是什么大问题,但假设我有5种或更多属性的25种可能性,并且我创建了数百或数千Location s,然后它开始累加。

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

正如Plutonix所建议的那样,您应该定义一个枚举:

Public Enum Direction
    North
    South
    East
    West
End Enum

您现在将属性声明为该类型。您几乎肯定已经使用了许多枚举,例如: DialogResult返回的ShowDialog以及MessageBox.Show使用的Dock。您可能在WinForms设计器中使用了一些数字,例如对于表单和控件的AnchorStyle属性,ProgressBar的{​​{1}}属性和DropDownStyle的{​​{1}}。

请注意,值由引擎盖下的数字表示 - ComboBox值默认情况下从零开始 - 调用Integer的结果将为您提供名称。如果您需要名称以外的其他内容,例如:你需要包含空格,然后你可以应用ToString属性并编写一些简单的代码来实现它。