2

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

我有这个开关功能:

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

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

4

5 回答 5

10

不是那样的,不。您可以使用代表:

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

或者你可以使用反射,正如其他人所提到的......但如果可能的话,我会尽量避免这种情况,特别是如果性能是一个问题。

不过,它确实感觉像是一个奇怪的设计——我会退后一步,考虑是否有一种更简洁的设计方式。(目前我们很难在没有更多上下文的情况下提供帮助。)

于 2013-10-03T12:31:47.840 回答
6

试试这个:

typeof(yourClassCOntainingLevel1Method).GetMethod("Level"+index).Invoke(this,null); 

yourClassCOntainingLevel1Method是你有Level1方法的类名

如果它与调用在同一类中:

typeof(this).GetMethod("Level"+index).Invoke(this,null); 
于 2013-10-03T12:30:49.883 回答
4

实现这一点的唯一方法是通过反射。但最好有一个将级别作为参数的级别函数:

public void Level(int number)
{
    ...
}
于 2013-10-03T12:30:25.433 回答
1

请尝试使用以下代码片段。

Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod("Level"+index);
theMethod.Invoke(this, userParameters);
于 2013-10-03T12:32:01.340 回答
0

我认为最好的方法是由 Jon Skeet 回答的委托。我们也可以尝试使用反射,但这不是最佳实践,因为性能受到影响。

于 2013-10-03T12:44:38.047 回答