使用相同的开关大小写,但定义不同
本文关键字:定义 大小写 开关 | 更新日期: 2023-09-27 18:32:39
我必须在不同的函数中重复使用相同的开关大小写。在不同的函数中,开关大小写的定义会有所不同。例如:
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);
这些操作是 lambda/普通方法。
一种可能性是使用一种使用 Action 委托的方法,如下所示:
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 );
或
MyFunction( groupId, Z, X, Y );
编辑
或者更好的方法是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 在这里是什么意思,所以请考虑更好的描述性名称):
public class Group0 : Group
{
public void FunctionA()
{
// Do Action A
}
public void FunctionB()
{
// Do Action Z
}
}
然后创建适当的组实例:
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();
}
}
并在您的应用程序中使用此组实例(应用程序不知道它正在使用哪个组实现):
IGroup group = CreateGroup(somenumber);
group.FunctionA(); // if group is Group1 then do action B
group.FunctionB(); // if group is Group1 then do action X