Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于按位和单值枚举组合的HasFlag_C#_.net_Enums_Keyboard_Bit Manipulation - Fatal编程技术网

C# 用于按位和单值枚举组合的HasFlag

C# 用于按位和单值枚举组合的HasFlag,c#,.net,enums,keyboard,bit-manipulation,C#,.net,Enums,Keyboard,Bit Manipulation,我有三个枚举-组合起来--应该可以确定一种独特的状态 枚举的结构,一些位字段,另一些不是 我想实现一个包含该状态的类,该类将提供一个Contains方法,该方法允许我以某种方式将这些枚举的组合视为支持按位操作的单个值 但我认为当前的实现不起作用,因为一些底层枚举不是位字段 由于键代码,Contains不起作用 如何实现我的目标,即能够将这些枚举的当前值(thisKeyEvent)与这些枚举值的输入集(作为另一个KeyEvent)进行比较,以确定输入值是否包含在当前实例中(但不一定等于它) 我可

我有三个枚举-组合起来--应该可以确定一种独特的状态

枚举的结构,一些位字段,另一些不是 我想实现一个包含该状态的类,该类将提供一个
Contains
方法,该方法允许我以某种方式将这些枚举的组合视为支持按位操作的单个值

但我认为当前的实现不起作用,因为一些底层枚举不是位字段

由于键代码,Contains不起作用 如何实现我的目标,即能够将这些枚举的当前值(
this
KeyEvent
)与这些枚举值的输入集(作为另一个
KeyEvent
)进行比较,以确定输入值是否包含在当前实例中(但不一定等于它)

  • 我可以简单地分别比较枚举,但有更好的解决方案吗
  • 我不想创建第四个枚举,它以位方式组合所有其他三个枚举

您必须这样定义
KeyCode

[Flags]
enum KeyCode {
    A = 1,
    B = 2,
    C = 4,
    D = 8,
    E = 16
} 
或使用

return (int)Math.Pow(2, (int)Key) + (int)State + (int)Modifiers;

您的
KeyCode
不是按位字段,因此在其上使用按位逻辑没有意义。但是,您可以很容易地取出
KeyCode
,并按照所示进行其余的比较

public int StateModifiers { get { return (int)State + (int)Modifiers; } }

public bool Contains(KeyEvent comparable)
{
    return Key == comparable.Key && ((StateModifiers & comparable.StateModifiers) == comparable.StateModifiers);
}

我复制了粘贴的
2^(int)键
,这是一个非常简洁的解决方案,但它不起作用,可能是因为你指的是
(int)Math.Pow(2,(int)Key)+(int)State+(int)修饰符
不幸的是,这在我的例子中也不起作用,因为实际上我在
KeyCode
中有200多个值,甚至
ulong
decimal
都没有足够大的最大值来容纳这样的幂次-所以我必须使用单独的枚举比较(这本身并不坏)。谢谢事实上,我指的是权力
^
是XOR,
:-(
。当然,每个枚举值需要一位。谢谢,这就是我现在要做的,但是使用.NET 4中提供的
HasFlag
扩展方法
return (int)Math.Pow(2, (int)Key) + (int)State + (int)Modifiers;
public int StateModifiers { get { return (int)State + (int)Modifiers; } }

public bool Contains(KeyEvent comparable)
{
    return Key == comparable.Key && ((StateModifiers & comparable.StateModifiers) == comparable.StateModifiers);
}