Использование OR'ed Enum в пользовательском UITypeEditor

У меня есть свойство на настраиваемом элементе управления, который я написал, это Enum на основе флага. Я создал свой собственный элемент управления, чтобы отредактировать его таким образом, который имеет логический смысл и вызвал его из моего собственного UITypeEditor. Проблема заключается в том, что Visual Studio генерирует ошибку, когда значение, которое я пытаюсь сохранить, представляет собой комбинацию флагов, которые она сообщает мне, что значение недопустимо.

Пример:

public enum TrayModes
{ 
    SingleUnit = 0x01
  , Tray = 0x02
  , Poll = 0x04
  , Trigger = 0x08
};

Если значение, которое я хочу сохранить, SingleUnit | Trigger, генерируемое значение равно 9. Это, в свою очередь, создает следующую ошибку:

Code generation for the property 'TrayMode' failed. Error was: 'The value '9' is not valid for the enum 'TrayModes'.'

Ответы

Ответ 1

You have to add [Flags] before your enum declaration

[Flags]
public enum TrayModes
{ 
    SingleUnit = 0x01
   , Tray = 0x02
   , Poll = 0x04
   , Trigger = 0x08
};

Рассмотрим использование функции HasFlag для проверки установленных флагов

TrayModes t=TrayModes.SingleUnit|TrayModes.Poll;
if(t.HasFlag(TrayModes.SingleUnit))
//return true

Изменить: Это потому, что перечисление с атрибутом флагов обрабатывается по-другому, как вы можете видеть в примере в http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx A В строку перечисления с атрибутом Flags и без него показано, как они отличаются

Все возможные комбинации значений Enum без флажкаАтрибут:

  0 - Black
  1 - Red
  2 - Green
  3 - 3
  4 - Blue
  5 - 5
  6 - 6
  7 - 7
  8 - 8

Все возможные комбинации значений Enum with FlagsAttribute:

  0 - Black
  1 - Red
  2 - Green
  3 - Red, Green
  4 - Blue
  5 - Red, Blue
  6 - Green, Blue
  7 - Red, Green, Blue
  8 - 8

Ответ 2

Использование атрибута Flags в перечислении предотвратит возникновение ошибки. Это тайна для меня, так как сохранение перечисления ORed без флага является действительным и может быть выполнено в коде (с правильным приведением).