Мой вопрос довольно прост, но я не нашел способа реализовать свой код так, как я хочу. Поэтому я начал задумываться, а не хорош ли код, который я хочу реализовать. И если это так, как лучше всего это сделать.
Вот так:
class InputManager
{
SortedDictionary<ushort,Keys> inputList = new SortedDictionary<ushort,Keys>();
public void Add(ushort id, Keys key) {...}
public bool IsPressed(ushort id) {...}
}
class Main
{
private enum RegisteredInput : ushort
{
Up,
Down,
Confirm
}
public Main()
{
InputManager manager = new InputManager();
manager.Add(RegisteredInput.Up, Keys.Q);
manager.Add(RegisteredInput.Down, Keys.A);
manager.Add(RegisteredInput.Confirm, Keys.Enter);
}
void update()
{
if(manager.IsPressed(RegisteredInput.Up)) action();
}
}
Этот код не скомпилируется, выдавая ошибки такого типа:
Наилучшее совпадение перегруженного метода для InputManager.Add (ushort, Keys) содержит недопустимые аргументы
Аргумент '1': невозможно преобразовать из 'RegisteredInput' в 'ushort'
Если я использую приведение типа manager.Add((ushort)RegisteredInput.Up, Keys.Q);
, оно будет работать. Но так как приведение должно быть явным, мне было интересно, не является ли он рекомендуемым кодом в C #, как это делается в C ++, и есть ли лучший способ сделать это (например, использовать const ushort
для каждого значения, что я вроде не делаю как много).
Лучший ответ, который я получил до сих пор, был от этой темы , но это звучит так же, как хак, я забеспокоился.
Спасибо!