我有一个奇怪的问题,我会先告诉你我的代码,然后我会问这个问题。
我有这个开关功能:
switch(index)
{
case 1:
Level1();
break;
case 2:
Level2();
break;
case 3:
Level3();
break;
case 4:
Level4();
break;
case 5:
Level5();
break;
}
如您所见,每个索引都调用一个名为“Level”和索引号的文件。
我可以将所有这些代码放在一行中,例如“Level + index()”是否可以?
答案 0 :(得分:10)
不是那样,不。您可以使用委托:
// Ideally make this a readonly field.
Action[] actions = { Level1, Level2, Level3, Level4, Level5 };
...
actions[index - 1]();
或者你可以像其他人提到的那样使用反射......但是如果可能的话,我会尽量避免使用反射,特别是如果表现是一个问题。
它确实感觉像是一个奇怪的设计 - 我退后一步,考虑是否有一种更简洁的设计方法。 (目前我们很难在没有更多背景的情况下帮助解决这个问题。)
答案 1 :(得分:6)
试试这个:
typeof(yourClassCOntainingLevel1Method).GetMethod("Level"+index).Invoke(this,null);
yourClassCOntainingLevel1Method
是一个类名,您可以使用Level1
方法
如果它与调用同一类:
typeof(this).GetMethod("Level"+index).Invoke(this,null);
答案 2 :(得分:4)
实现这一目标的唯一方法是通过反思。但是最好有一个Level级别的函数将该级别作为参数:
public void Level(int number)
{
...
}
答案 3 :(得分:1)
请尝试使用以下代码段。
Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod("Level"+index);
theMethod.Invoke(this, userParameters);
答案 4 :(得分:0)
我认为最好的方式是由Jon Skeet回答的委托。我们也可以尝试使用反射,但这并不是最佳实践,因为性能受到了影响。