使用其名称中的参数调用函数

Ori*_*ish 2 c# parameters function

我有一个奇怪的问题,我先向你展示我的代码,然后我会问这个问题.

我有这个开关功能:

switch(index)
    {
        case 1:
        Level1();
        break;
        case 2:
        Level2();
        break;
        case 3:
        Level3();
        break;
        case 4:
        Level4();
        break;
        case 5:
        Level5();
        break;
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,每个索引都调用一个名为"Level"和索引号的函数.

我可以将所有这些代码放在一行中,例如"Level + index()"是否可能?

Jon*_*eet 10

不是那样的,没有.你可以使用代表:

// Ideally make this a readonly field.
Action[] actions = { Level1, Level2, Level3, Level4, Level5 };
...
actions[index - 1]();
Run Code Online (Sandbox Code Playgroud)

或者你可以像其他人提到的那样使用反射......但是如果可能的话,我会尽量避免使用反射,特别是如果性能是一个问题.

它确实感觉像一个奇怪的设计 - 我退后一步,考虑是否有一个更简洁的设计方式开始.(目前我们很难在没有更多背景的情况下帮助解决这个问题.)


Kam*_*ski 6

试试这个:

typeof(yourClassCOntainingLevel1Method).GetMethod("Level"+index).Invoke(this,null); 
Run Code Online (Sandbox Code Playgroud)

yourClassCOntainingLevel1Method是一个具有Level1方法的类名

如果它与调用相同的类:

typeof(this).GetMethod("Level"+index).Invoke(this,null); 
Run Code Online (Sandbox Code Playgroud)