结合枚举

时间:2020-03-05 18:52:04  来源:igfitidea点击:

有没有一种方法可以在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,
泰勒