结合枚举
有没有一种方法可以在VB.net中合并枚举?
解决方案
回答
如果我们打算使用enum flags(),那么这里有一篇不错的文章。
回答
如果我正确理解了问题,则希望合并不同的枚举类型。因此,一个变量可以存储来自两个不同枚举值之一的值吗?如果我们要存储一个枚举类型的两个不同值的合并存储,可以查看Dave Arkell的解释
枚举只是一些语法糖的整数。因此,如果我们确定不存在重叠,则可以通过强制转换为int来合并它们。
但是,它不会生成漂亮的代码。我尽量避免在大多数情况下使用枚举。通常,如果让枚举在代码中繁殖,那么它们会产生重复的case语句和其他混乱的反模式只是时间问题。
回答
组合Enum的关键是确保该值是2的幂(1、2、4、8等),以便我们可以对它们执行位运算(| =``&=
)。这些Enum
可以用Flags
属性标记。 Windows窗体控件上的Anchor
属性就是这样一个控件的示例。如果将其标记为标志,Visual Studio将允许我们检查值,而不是在属性设计器的下拉菜单中选择单个值。
回答
我相信我们想要的是一个标记类型的枚举。
我们需要将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,
泰勒