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