如何测试枚举是否包含在数字中?



在VB6中,我像这样组合了几个DT_DRAW_FLAG值:

dim lMyFlags As DT_DRAW_FLAG
lMyFlags = DT_CENTER OR DT_VCENTER OR DT_RTLREADING

这将导致lMyFlags = 131077

现在要测试某个标志是否包含在这样的组合标志值中,我将执行以下操作:
If (131077  And DT_RTLREADING) = DT_RTLREADING Then
'DT_RTLREADING is contained. 
Else
'DT_RTLREADING is NOT contained. 
End Enum

如何在VB.NET中做到这一点?

我还需要使用这个"pure math"吗?方法,或者是否有一个方法像…

lMyFlags.ContainsEnum(DT_RTLREADING)

…我还没找到?

谢谢!

如果你有一个像这样的enum声明

<Flags()> Public Enum DT_DRAW_FLAG As Integer
DT_CENTER = 1
DT_VCENTER = 2
DT_RTLREADING = 4
End Enum

然后你可以使用HasFlag来做你的逻辑

Dim lMyFlags As DT_DRAW_FLAG = DT_DRAW_FLAG.DT_CENTER Or DT_DRAW_FLAG.DT_RTLREADING
lMyFlags.HasFlag(DT_DRAW_FLAG.DT_RTLREADING) ' => true

这里的重点是单个枚举值是2的幂。

接受的答案是好的,它有效。在你的例子中,你的Enum可能已经有了flags属性,因为它是2的三个幂的组合:2^0=1,2^2=4,和2^17=131072

你的enum可能看起来像这样

<Flags>
Public Enum DT_DRAW_FLAG As Long
''' <summary>
''' 2 ^ 0
''' </summary>
DT_CENTER = 1
' 2 ^ 1 in here
''' <summary>
''' 2 ^ 4
''' </summary>
DT_VCENTER = 4
' 2 ^ 3 through 2 ^ 16 in here
''' <summary>
''' 2 ^ 17
''' </summary>
DT_RTLREADING = 131072
End Enum

Flags属性

表示枚举可以作为位域处理;也就是一组标志。

但是,无论它是否具有Flags属性,您都可以使用按位和以相同的方式对待它。我相信HasFlags函数只是位逻辑的简写:

' Bitwise logic
If (lMyFlags And DT_DRAW_FLAG.DT_RTLREADING) = DT_DRAW_FLAG.DT_RTLREADING Then
' Reading is contained
Else
' Reading is not contained
End If
' HasFlags
If lMyFlags.HasFlag(DT_DRAW_FLAG.DT_RTLREADING) Then
' Reading is contained
Else
' Reading is not contained
End If

代码当然少了。

注意,如果没有一些额外的转换,您不能按照所示的方式组合枚举。使用按位Or

Dim lMyFlags = DT_DRAW_FLAG.DT_CENTER Or DT_DRAW_FLAG.DT_VCENTER Or DT_DRAW_FLAG.DT_RTLREADING

也可以使用Enum。不管你是否使用Flags属性。据我所知,该属性仅用于向消费者发出信号,表明这些值是2的不同幂,并且可以对它们执行位逻辑。flags属性没有什么严格意义上的变化,所以消费者对它有一定的信任,知道该怎么处理它(我们假设原作者也知道)

最新更新