У меня есть программа, которая должна выполнять функции acording к Enum и мне интересно, если есть другой способ, чем это:C# Действие/Список функций
enum FunctionType
{
Addition = 0,
Substraction = 1,
Mutiplication = 2,
Division = 3
}
void ExecuteFunction(FunctionType Function)
{
switch(Function)
{
case FunctionType.Addition: Addition();
break;
case FunctionType.Substraction: Subsctration();
break;
...
default: ...
}
}
(Это не код я «Я использую это, это просто представление того, что я хочу делать». Этот подход должен работать нормально, но что происходит, когда у вас гораздо больше функций? Я не хочу иметь 50 линейных переключателей. Так что я хочу знать, если есть способ, чтобы упростить его, что-то вроде этого, может быть:
enum FunctionType : Action
{
Addition = new Action(Addition);
Substraction = new Action(Substraction);
....
}
void ExecuteFunction(FunctionType Function)
{
(Action)Function.Invoke();
}
Нет переключателя не требуется, и что может быть 50 строк превращаются в 1 строку. Но это невозможно сделать, только числовые типы используются как перечисления. Я думаю, что возможно иметь List<T>
действий, но для этого потребуется добавить каждое действие в список во время выполнения.
EDIT: Я нашел в исходном коде способ, которым это делается, но я не могу это понять. Это то, что я получаю: Они создают обычай Attribute
, содержащий string
(название метода) и на методах, которые они делают:
[CustomAtrribute("name")]
void Method()
{
}
Тогда я не знаю, как это называется по его имени, я угадайте какое-то отражение, бу, я не знаю, как найти информацию об этом.
EDIT2: Я нашел способ, которым я хочу это сделать. Я добавлю интерфейс с функцией, а затем реализую этот интерфейс с кодом внутри функции и использую Dictionary<Enum, Interface>
для его вызова. Я не знаю. Если я должен ответить на свой вопрос, так или иначе, спасибо всем, кто помог мне.
Ну вы могли бы иметь 'Dictionary' ... но опять же, вы должны построить его во время выполнения. Если имена методов совпадают с именами значений enum, вы можете сделать это через отражение. –
Вы можете запустить действие, просто добавив '()', не нужно делать '.Invoke()'. Просто fyi – vrwim
@Jon Skeet Может быть, словарь отлично работает, но добавление не все звучит неплохо. Тем не менее, все же лучше, чем гигантский переключатель. Создание каждого имени метода соответствует каждому имени переименования звучит немного опасно при добавлении новых вещей. – null