从存储的标志枚举值

时间:2016-03-16 12:21:58

标签: .net vb.net enums

不确定如何说出问题,请原谅我。

我正在使用Aforge.Controls.Joystick存储游戏手柄按钮按组合作为整数。 IT使用标志枚举器按下按钮 - 例如按钮1返回小数1,按钮2小数2和按钮1和2一起3(2 + 1)。

我将这个小数存储在ini中,以便在另一个类中使用。我需要做的是在另一个类中检索这个小数,并构造一个按下按钮的整数数组(基本上,哪些位是真/ 1)。一些例子:

检索到的十进制:3 返回:1,2

检索到的十进制:16 返回:5

检索到的十进制:22 返回:5,3,2

我知道我错过了一些令人眼花缭乱的东西,但迷失在所有概念中(例如按位,标记枚举等)

非常感谢任何帮助...

EDIT1:以下评论:

必须使用ini在应用程序运行之间存储此值。

在混淆之后,操纵杆的枚举器看起来像这样:

<Flags> Public Enum Pets
   Button1 = 1
   Button2 = 2
   Button3 = 4
   Button4 = 8
   Button5 = 16
End Enum

因此&#34; 22&#34;按钮5,3和2(16 + 4 + 2)

EDIT2:回复1

尝试:

        Imports AForge.Controls
        Imports AForge

        Dim txt = "22"            ' value from "ini"
        ' parse back into an enum
        Dim ButtonsPress As Joystick.Buttons = CType([Enum].Parse(GetType(Joystick.Buttons), txt), Joystick.Buttons)

        Dim picks = [Enum].GetValues(GetType(Joystick.Buttons)).
                Cast(Of Joystick.Buttons).
                Where(Function(q) ButtonsPress.HasFlag(q)).
                ToArray()

        For Each v As Joystick.Buttons In picks
            Console.WriteLine(v.ToString())
        Next

但是,它不会编译:

  'HasFlag' is not a member of 'AForge.Controls.Joystick.Buttons'

但是,当我在对象浏览器中检查Joystick.Buttons时,摘要显示: &#34;标志操纵杆按钮的枚举。&#34;

...困惑

EDIT3 - 解决了

回答以下评论和答案的组合。根据原始问题获取具体数字:

        Dim txt = "22"            ' value from "ini"
        Dim ButtonsPress As Joystick.Buttons = CType([Enum].Parse(GetType(Joystick.Buttons), txt), Joystick.Buttons)
        Dim picks = [Enum].GetValues(GetType(Joystick.Buttons)).
                Cast(Of Joystick.Buttons).
                Where(Function(q) (ButtonsPress And q) = q).
                ToArray()
        For Each v As Joystick.Buttons In picks
            Console.WriteLine(v.ToString().Remove(0, 6))
        Next

产地:

2
3
5

1 个答案:

答案 0 :(得分:1)

第一步,将存储的值恢复为Enum类型:

Dim txt = "22"            ' value from "ini"
' parse back into an enum
Dim p As Pets = CType([Enum].Parse(GetType(Pets), txt), Pets)

如果将数据序列化为类型化数据而不是存储为文本,则可以跳过这两个步骤。然后,获取一个表示的枚举值数组:

Dim picks = [Enum].GetValues(GetType(Pets)).
                    Cast(Of Pets).
                    Where(Function(q) p.HasFlag(q)).
                    ToArray()

HasFlag的替代方法是长格式:Where(Function(q) (p And q) = q)。然后测试一下:

For Each v As Pets In picks
    Console.WriteLine(v.ToString())
Next

如果要打印/查看整数值而不是名称,请使用Console.WriteLine(v)

结果:

  

将Button2
  BUTTON3
  Button5

有一点需要注意的是Enum可以包含组合:

<Flags> Public Enum Buttons
    A = 1
    B = 2
    AB = 3
    C = 4
    D = 8
    E = 16
    All = 31
End Enum

当值为3时,阵列将有效地包括{A,B,AB},每次两次。值31将包含所有7个元素。