结合枚举

时间:2008-09-12 08:42:08

标签: .net vb.net enums

有没有办法在VB.net中组合Enums?

5 个答案:

答案 0 :(得分:41)

我相信你想要的是一个旗帜类型枚举。

您需要将标志属性添加到枚举的顶部,然后您可以将枚举与“或”关键字结合使用。

像这样:

<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

答案 1 :(得分:3)

您可以使用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)

它们有效地组合(位数学),以便上述用户同时具有Read和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, 泰勒

答案 2 :(得分:1)

如果我正确理解您的问题,您想要组合不同的枚举类型。那么一个变量可以存储来自两个不同枚举之一的值吗?如果您要求存储组合一个枚举类型的两个不同值,您可以查看Dave Arkell的解释

枚举只是带有一些语法糖的整数。因此,如果确保没有重叠,可以通过转换为int来组合它们。

虽然不会有漂亮的代码。我尽量避免在大多数时候使用枚举。通常,如果你让代码在你的代码中繁殖,那么在它们生成重复的案例陈述和其他混乱的反模式之前只是时间问题。

答案 3 :(得分:1)

组合Enum的关键是确保该值是2的幂(1,2,4,8等),以便您可以对它们执行位操作({{1 }} |=)。这些&=可以使用Enum属性进行标记。 Windows窗体控件上的Flags属性是此类控件的示例。如果它被标记为标志,Visual Studio将允许您检查值,而不是在属性设计器的下拉列表中选择单个值。

答案 4 :(得分:0)

如果您正在使用enum flags(),那么有一篇好文章here