Объединение Enums - PullRequest
       27

Объединение Enums

26 голосов
/ 12 сентября 2008

Есть ли способ объединить Enums в VB.net?

Ответы [ 5 ]

41 голосов
/ 12 сентября 2008

Я верю, что вы хотите перечисление типа флага.

Вам необходимо добавить атрибут Flags в начало перечисления, а затем объединить перечисления с ключевым словом «Or».

Как это:

<Flags()> _
Enum CombinationEnums As Integer
  HasButton = 1
  TitleBar = 2
  ReadOnly = 4
  ETC = 8
End Enum

Примечание: Числа справа всегда в два раза больше (степени 2) - это необходимо для возможности разделения отдельных установленных флагов.

Объедините нужные флаги, используя ключевое слово Or:

Dim settings As CombinationEnums
settings = CombinationEnums.TitleBar Or CombinationEnums.Readonly

Это устанавливает TitleBar и Readonly в перечисление

Чтобы проверить, что было установлено:

If (settings And CombinationEnums.TitleBar) = CombinationEnums.TitleBar Then
  Window.TitleBar = True
End If
3 голосов
/ 12 сентября 2008

Вы можете использовать FlagsAttribute для украшения Enum как, что позволит вам комбинировать Enum:

<FlagsAttribute> _
Public Enumeration SecurityRights
None = 0
Read = 1
Write = 2
Execute = 4

А затем вызывать их так (класс UserPriviltes):

Public Sub New ( _
    options As SecurityRights _
)

New UserPrivileges(SecurityRights.Read OR SecurityRights.Execute)

Они эффективно объединяются (битовая математика), так что вышеупомянутый пользователь может одновременно выполнять операции чтения и выполнения в одной причудливой переменной SecurityRights.

Чтобы проверить, есть ли у пользователя привилегия, которую вы используете AND (более побитовая математика), чтобы проверить значение enum пользователя со значением Enum, которое вы проверяете:

//Check to see if user has Write rights
If (user.Privileges And SecurityRights.Write = SecurityRigths.Write) Then
    //Do something clever...
Else
    //Tell user he can't write.
End If

НТН, Тайлер

1 голос
/ 12 сентября 2008

Если я правильно понимаю ваш вопрос, вы хотите объединить различные типы перечислений. Таким образом, одна переменная может хранить значение одного из двух различных перечислений, верно? Если вы спрашиваете о сохранении объединения двух разных значений одного типа enum, вы можете посмотреть объяснение Дейва Аркелла

Перечисления - это просто целые числа с некоторым синтаксическим сахаром. Поэтому, если вы убедитесь, что нет совпадений, вы можете объединить их, приведя к int.

Хотя это не будет хорошим кодом. Я стараюсь избегать использования перечислений большую часть времени. Обычно, если вы позволяете перечислениям размножаться в вашем коде, это просто вопрос времени, когда они породят повторяющиеся утверждения и другие грязные антипаттерны.

1 голос
/ 12 сентября 2008

Ключ к комбинации Enum s - убедиться, что значение является степенью двойки (1, 2, 4, 8 и т. Д.), Что позволяет выполнять над ними битовые операции (|= &=). Эти Enum s могут быть помечены атрибутом Flags. Свойство Anchor в элементах управления Windows Forms является примером такого элемента управления. Если он помечен как флаг, Visual Studio позволит вам проверять значения, а не выбирать одно в раскрывающемся списке в конструкторе свойств.

0 голосов
/ 12 сентября 2008

Если вы собираетесь использовать enum flags (), то есть хорошая статья здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...