C#动作/function列表

我有一个程序必须根据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: ... } } 

(这不是我正在使用的代码,它只是代表我想要做的事情)。 这种方法应该可以正常工作,但是当你有更多function时会发生什么? 我不想要50线开关。 所以我想知道是否有办法简化它,这样的事情可能是:

 enum FunctionType : Action { Addition = new Action(Addition); Substraction = new Action(Substraction); .... } void ExecuteFunction(FunctionType Function) { (Action)Function.Invoke(); } 

不需要开关,可以将50条线转换成1条线。 但这是不可能的,只有数字类型作为枚举加入。 我认为有一个List的动作是可行的,但是需要在runetime将每个动作添加到列表中。

编辑:我已经在源代码上找到了这样做的方法,但我无法理解它。 这就是我得到的:他们创建一个包含string (方法名称)的自定义Attribute以及它们执行的方法:

 [CustomAtrribute("name")] void Method() { } 

然后我不知道这是怎么称它的名字,我想某种reflection,我不知道如何找到有关这方面的信息。

EDIT2:我找到了我想要的方式,我将添加一个带有函数的接口,然后用函数内部的代码实现该接口,并使用Dictionary来调用它。 我不知道如果我应该回答我自己的问题,无论如何,感谢所有人帮助过我。

不能说我会建议这样做但是:

 public static class Functions { public static Func Add = (x, y) => { return x + y; }; } 

然后你只需要调用Functions.Add(1,1)

如果你真的必须使用枚举,那么你可以这样做:

 public static class Functions { public static void Add() { Debug.Print("Add"); } public static void Subtract() { Debug.Print("Subtract"); } public enum Function { Add, Subtract } public static void Execute(Function function) { typeof(Functions).GetMethod(function.ToString()).Invoke(null, null); } } 

然后是Functions.Execute(Functions.Function.Add) (额外的函数是因为我的枚举在Functions类中)。

如果您的函数包含相同的signature那么您可以执行类似的操作

 enum FunctionType { Addition = 0, Substraction = 1, Mutiplication = 2, Division = 3 } void ExecuteFunction(FunctionType Function) { //variable will contain function to execute public Func functionToExecute= null; switch(Function) { case FunctionType.Addition: functionToExecute=Addition; break; case FunctionType.Substraction: functionToExecute=Subsctration; break; ... default: ... } //Checking if not reached default case if(functionToExecute!=null) { var result= functionToExecute(para1,para2); ............... } }