C# 使用相同的开关箱,但定义不同
我必须在不同的功能中重复使用同一个开关盒。在不同的功能中,开关盒定义将不同。例如:C# 使用相同的开关箱,但定义不同,c#,switch-statement,C#,Switch Statement,我必须在不同的功能中重复使用同一个开关盒。在不同的功能中,开关盒定义将不同。例如: int groupID = somenumber; private void FunctionA() { switch (groupID) { case 0: // Do Action A break; case 1:
int groupID = somenumber;
private void FunctionA()
{
switch (groupID)
{
case 0:
// Do Action A
break;
case 1:
// Do Action B
break;
case 2:
// Do Action C
break;
}
}
private void FunctionB()
{
switch (groupID)
{
case 0:
// Do Action Z
break;
case 1:
// Do Action X
break;
case 2:
// Do Action Y
break;
}
}
是否有任何方法可以一次使用同一个开关盒,但定义可能不同?我真诚地相信有更好的方法来完成您想要完成的任务,但您需要向我们提供更多细节 在目前情况下,一种可能的解决办法是:
private void SwitchStuff(Action action0, Action action1, Action action2)
{
switch (groupID)
{
case 0:
action0();
break;
case 1:
action1();
break;
case 2:
action2();
break;
}
}
然后像这样使用它:
SwitchStuff(DoActionA, DoActionB, DoActionC);
SwitchStuff(DoActionX, DoActionY, DoActionZ);
其中这些操作是lambdas/normal方法。一种可能性是使用一种方法,该方法使用操作委托,如下所示:
private void MyFunction(int groupID, Action a, Action b, Action c)
{
switch (groupID)
{
case 0:
a();
break;
case 1:
b();
break;
case 2:
c();
break;
}
}
MyFunction( groupId, A, B, C );
然后你可以这样称呼它:
private void MyFunction(int groupID, Action a, Action b, Action c)
{
switch (groupID)
{
case 0:
a();
break;
case 1:
b();
break;
case 2:
c();
break;
}
}
MyFunction( groupId, A, B, C );
或
编辑
或者更好的方法是Matthew Watson建议的变体:
将方法更改为
private void MyFunction(int groupID, params Action[] actions)
{
actions[groupId]();
}
然后扔掉整个开关箱。您可以用与上面完全相同的方式调用它。您可以用多态性替换switch语句。创建表示组的接口或基类:
public interface Group
{
void FunctionA(); // if Group is a class, then make these methods
void FunctionB(); // virtual or abstract
}
然后为每个组创建类(对不起,我不知道这里是0,1,2意味着什么,所以请考虑更好的描述性名称):
然后创建相应的组实例:private IGroup CreateGroup(int groupID)
{
switch (groupID)
{
case 0: return new Group0();
case 1: return new Group1();
case 2: return new Group2();
default:
throw new ArgumentException();
}
}
并在应用程序中使用此组实例(应用程序不知道正在使用哪个组实现):
对于这些类型的情况,最好的方法是使用多态性和继承。你考虑过这种方法吗?多态性和继承性?如何进行?@DEN:重构的名称非常简单:。您还可以传入一系列操作。谢谢!以后再试试看。:)
IGroup group = CreateGroup(somenumber);
group.FunctionA(); // if group is Group1 then do action B
group.FunctionB(); // if group is Group1 then do action X