有没有办法在 VB.net 中组合枚举?
5 回答
我相信你想要的是一个标志类型的枚举。
您需要将 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 变量中同时拥有 Read 和 Execute。
要检查用户是否有特权,您可以使用 AND(更多按位数学)来检查用户枚举值和您要检查的枚举值:
//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,泰勒
如果您开始使用 enum flags(),这里有一篇很好的文章。
如果我正确理解您的问题,您想组合不同的枚举类型。所以一个变量可以存储来自两个不同枚举之一的值,对吗?如果您询问存储组合一个枚举类型的两个不同值,您可以查看 Dave Arkell 的解释
枚举只是带有一些语法糖的整数。因此,如果您确保没有重叠,您可以通过转换为 int 来组合它们。
但它不会产生漂亮的代码。我大部分时间都尽量避免使用枚举。通常,如果您让枚举在您的代码中滋生,那么它们会产生重复的 case 语句和其他混乱的反模式只是时间问题。
组合Enum
s 的关键是确保该值是 2 的幂(1、2、4、8 等),以便您可以对它们执行位操作(|=
&=
)。这些Enum
s 可以用Flags
属性标记。Windows 窗体控件上的Anchor
属性就是此类控件的一个示例。如果它被标记为标志,Visual Studio 将允许您检查值,而不是在属性设计器的下拉列表中选择单个值。