У меня есть три перечисления, которые - в сочетании - должны идентифицировать уникальное положение дел.
Структура Enums, некоторые битовые поля, другие нет
enum KeyCode
{
A,
B,
C,
D,
E
}
[Flags]
enum KeyModifiers
{
Empty = 0,
NoModifiers = 10000,
Shift = 20000,
Control = 40000,
Alt = 80000
}
enum KeyState
{
Empty = 0,
Down = 10000000,
Up = 20000000
}
Я хотел бы реализовать класс, который охватывает это состояние и который обеспечил бы метод Contains
, который позволил бы мне как-то трактовать комбинацию этих перечислений как одно значение, поддерживающее побитовые операции.
Но текущая реализация не работает, я полагаю, потому что некоторые из базовых перечислений не являются битовыми полями.
Содержит не работает из-за KeyCode
class KeyEvent
{
public KeyEvent(KeyCode key, KeyState down = KeyState.Empty, KeyModifiers modifiers = KeyModifiers.Empty)
{
Key = key;
State = down;
Modifiers = modifiers;
}
public int Id
{
get
{
return (int)Key + (int)State + (int)Modifiers;
}
}
public KeyCode Key { get; set; }
public KeyState State { get; set; }
public KeyModifiers Modifiers { get; set; }
public bool Contains(KeyEvent comparable)
{
return (Id & comparable.Id) == comparable.Id;
}
}
Как я мог достичь своей цели, которая заключается в том, чтобы иметь возможность сравнивать текущие значения этих перечислений (this
KeyEvent
) с входным набором этих значений перечисления (как еще один KeyEvent
) так как определить, содержатся ли входные значения в текущем экземпляре (но не обязательно равны ему)?