使用相同的开关盒但定义不同

DEN*_*DEN 2 c# switch-statement

我必须在不同的功能中重复使用相同的开关盒.在不同的功能中,开关盒的定义会有所不同.例如:

    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是一次使用相同开关盒的任何方法但定义可能不同吗?

Nik*_*off 6

我真诚地相信有更好的方法来做你想要完成的事情,但你需要给我们更多的细节.

在目前的情况下,一种可能的解决方案是:

private void SwitchStuff(Action action0, Action action1, Action action2)
{
    switch (groupID)
    {
        case 0:
            action0();
            break;
        case 1:
            action1();
            break;
        case 2:
            action2();
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它像:

SwitchStuff(DoActionA, DoActionB, DoActionC);
SwitchStuff(DoActionX, DoActionY, DoActionZ);
Run Code Online (Sandbox Code Playgroud)

这些行为是lambda/normal方法.

  • 您还可以传递一系列操作. (2认同)

Øyv*_*hen 5

一种可能性是使用一个使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样调用它:

MyFunction( groupId, A, B, C );
Run Code Online (Sandbox Code Playgroud)

要么

MyFunction( groupId, Z, X, Y );
Run Code Online (Sandbox Code Playgroud)

编辑

或者更好的方法是Matthew Watson建议的变体:

将方法更改为

private void MyFunction(int groupID, params Action[] actions)
{
  actions[groupId]();
}
Run Code Online (Sandbox Code Playgroud)

并摆脱整个开关盒.你用与上面完全相同的方式调用它.