2014-10-07 2 views
1

Я ищу более чистый способ, чем то, что я собираюсь представить, чтобы ограничить возможные значения свойства string. Предположим, у меня есть класс со свойством «Направление»Элегантный способ ограничения возможных значений свойства string

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 с, то я создал эту коллекцию снова и снова. Для этого примера это не так уж и важно, но предположим, что у меня есть 25 возможностей для 5 или более свойств, и я создаю сотни или тысячи Location s, затем он начинает складываться.

Есть ли лучший способ достичь этого?

Следует также отметить, что на всякий случай это усложняет ситуацию, что я хотел бы перевести ввод в принятое значение в определенных случаях. Например, используется «N», и я хотел бы автоматически превратить это в «Север».

Любые идеи?

+1

Определите одну или несколько Enums, и большая часть кода проверки может исчезнуть - если указатель направления «Как myEnum» не требует проверки. для строкового представления вы можете использовать 'enumDirection.Tostring' – Plutonix

+0

А, я знал о' .ToString', но не понимал, что так работает с Enums. Спасибо. Я подозревал, что Enums - это способ достичь этого, но я не мог пройти мимо, не используя числовое значение. – MattB

ответ

3

По предложению Plutonix, вы должны быть определение перечисления:

Public Enum Direction 
    North 
    South 
    East 
    West 
End Enum 

Вы объявляете свою собственность, как этот тип. Вы почти наверняка уже использовали несколько перечислений, например. DialogResult, возвращенные ShowDialog, и некоторые из них используются MessageBox.Show. Есть также номер, который вы, возможно, использовали в дизайнере WinForms, например. для Dock и Anchor свойств форм и средств контроля, Style имущество ProgressBar и DropDownStyle от ComboBox.

Обратите внимание, что значения представлены цифрами под капотом - значения Integer начинаются с нуля по умолчанию - и результат вызова ToString даст вам имя. Если вам нужно что-то другое, кроме имени, например. вам нужно включить пробелы, тогда вы можете применить атрибут Description и написать простой код для его получения.

Смежные вопросы