在自定义UITypeEditor中使用OR'ed枚举

时间:2013-03-27 15:48:50

标签: c# enums enum-flags

我在自编写的自定义控件上有一个属性,它是一个基于标志的枚举。我创建了自己的自定义控件,以一种具有逻辑意义的方式对其进行编辑,并从我自己的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'.'

2 个答案:

答案 0 :(得分:0)

在枚举上使用Flags属性可以防止错误发生。这对我来说是一个谜,因为存储没有标志的ORed枚举是有效的,可以在代码中完成(使用适当的强制转换)。

答案 1 :(得分:0)

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

编辑: 这是因为带有flags属性的枚举以不同的方式进行威胁, 正如您在http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx中的示例中所看到的 A带有和不带Flags属性的to enum字符串显示它们是如何不同的

a的所有可能的值组合 没有FlagsAttribute的枚举:

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

a的所有可能的值组合 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