VB.NET中如何检测组合枚举值是否包含指定枚举项?
VB.NET中位标志枚举的判断方法
核心结论
你不需要一直使用纯按位运算的判断逻辑,.NET Framework 4.0及以上版本的VB.NET已经提供了你想要的内置判断方法,即HasFlag()。
使用前提
首先需要给位枚举类型添加<Flags>特性,这是.NET识别位组合枚举的标准规范,对应你的枚举示例定义如下:
<Flags> Public Enum DT_DRAW_FLAG DT_CENTER = 1 DT_VCENTER = 4 DT_RTLREADING = 131072 ' 对应你示例中组合后得到131077的取值 ' 其余枚举值按2的幂次规则依次定义 End Enum
具体用法
组合多个枚举标记的写法和VB6基本一致,判断是否包含某个标记直接调用HasFlag方法即可,和你期望的ContainsEnum效果完全相同:
' 组合多个标记值 Dim lMyFlags As DT_DRAW_FLAG = DT_CENTER Or DT_VCENTER Or DT_RTLREADING ' 判断是否包含指定标记 If lMyFlags.HasFlag(DT_RTLREADING) Then ' 执行包含DT_RTLREADING的逻辑 Else ' 执行不包含DT_RTLREADING的逻辑 End If
补充说明
- 你熟悉的VB6风格按位与判断写法在VB.NET中完全兼容,仅需要修正原示例里笔误的
End Enum为End If即可,写法如下:
这种写法和If (lMyFlags And DT_RTLREADING) = DT_RTLREADING Then ' 执行包含标记的逻辑 End IfHasFlag执行效果完全一致,在低于.NET Framework 4.0的老旧运行环境中可以使用这种写法。 - 日常开发优先推荐使用
<Flags>特性搭配HasFlag方法,代码可读性更高,是.NET生态的标准实现方式。
内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

