我有一个具有执行功能acording一个枚举,我想知道如果有另一种方式把它比这个程序: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>
的动作,但是需要在runetime将每个动作添加到列表中。
编辑: 我在源代码中发现了这样做的一种方式,但我无法真正理解它。这就是我得到: 他们创建一个包含string
(方法名称)的自定义Attribute
和方法,他们做的事:
[CustomAtrribute("name")]
void Method()
{
}
然后,我不知道这是怎么叫通过它的名字,我猜猜某种形式的refelction,我不知道如何找到关于此的信息。编辑2:我找到了我想要做到这一点的方式,我将添加一个带有函数的接口,然后使用函数中的代码实现该接口,然后使用Dictionary<Enum, Interface>
来调用它。我不知道我是否应该回答自己的问题,无论如何,感谢大家帮助我。
那么你可以有一个'词典<函数类型,操作>'...但同样,你需要建立起来在执行时。如果方法名称都与枚举值名称匹配,则可以通过反射来完成。 –
你可以通过追加'()'来运行一个动作,不需要执行'.Invoke()'。只是一个fyi – vrwim
@Jon Skeet也许词典的工作正常,但添加一切听起来不太好。尽管如此,还是比一个巨大的开关更好。使每个枚举名称匹配每个枚举名称听起来有点危险添加新东西 – null