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

时间:2013-10-03 12:28:09

标签: c# function parameters

我有一个奇怪的问题,我会先告诉你我的代码,然后我会问这个问题。

我有这个开关功能:

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()”是否可以?

5 个答案:

答案 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回答的委托。我们也可以尝试使用反射,但这并不是最佳实践,因为性能受到了影响。