Вопрос

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

Это было полезно?

Решение

Я считаю, что вам нужно перечисление типов флагов.

Вам нужно добавить атрибут 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

Другие советы

Вы можете использовать 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, которое вы проверяете:

//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

HTH, Тайлер

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top