У меня есть программа, которая должна выполнять функцию в соответствии с Enum, и мне интересно, есть ли другой способ, кроме этого:
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>
действий, но для этого потребуется добавить каждое действие в список во время выполнения.
РЕДАКТИРОВАТЬ: я нашел в исходном коде способ, которым это делается, но я не могу этого понять. Вот что я получаю: они создают пользовательский Attribute
, который содержит string
(имя метода) и методы, которые они делают:
[CustomAtrribute("name")]
void Method()
{
}
Тогда я не знаю, как это называется по имени, я предполагаю, что это какое-то отражение, но я не знаю, как найти информацию об этом.
EDIT2: я нашел способ сделать это, я добавлю интерфейс с функцией, затем реализую этот интерфейс с кодом внутри функции и использую Dictionary<Enum, Interface>
для его вызова. Я не знаю, должен ли я отвечать на свой вопрос, в любом случае, спасибо всем, кто мне помог.
Dictionary<FunctionType, Action>
... но опять же, вам нужно будет создать его во время выполнения. Если все имена методов совпадают с именами значений перечисления, вы можете сделать это с помощью отражения. - person Jon Skeet   schedule 19.08.2016()
, не нужно делать.Invoke()
. Просто к вашему сведению - person vrwim   schedule 19.08.2016ExecuteFunction
не может просто взятьAction
или что-то в этом роде? - person Jon Skeet   schedule 19.08.2016int
и анализируется в Enum. С несколькими различными типами пакетов коммутатор был бы в порядке, но когда я обновляю программу, я хочу добавить больше пакетов, и я хочу, чтобы код был чистым, а не переключателем 50 case. - person Pau C   schedule 19.08.2016