按编号调用方法

时间:2012-12-17 15:36:03

标签: c#

假设我有6种方法:Method1()Method2()Method3()Method4()Method5()Method6()。我还有另一种方法SuperMethod(int nr),它将调用其他方法之一。如果SuperMethod的输入为1,则会调用Method1(),依此类推。

这可以在没有switch语句或堆叠if-else语句的情况下以优雅的方式完成吗?

我应该补充一点,这不是我正在编写的重要生产代码,因此性能不是问题。

5 个答案:

答案 0 :(得分:6)

你可以使用代表,这对解决短程序的现实世界问题也很有意义:

    public void CollatzTest(int n)
    {
        var f = new Func<int, int>[] { i => i / 2, i => i * 3 + 1 };

        while (n != 1)
            n = f[n % 2](n);
    }

也适用于操作和直接方法引用

    private void DelegateActionStartTest()
    {
        Action[] Actions = new Action[] { UselesstTest, IntervalTest, Euler13 };

        int nFunction = 2;

        Actions[nFunction]();
    }

答案 1 :(得分:2)

  

假设我有6种方法:Method1(),Method2()......

然后你有可怕的方法名称。我会适当地命名方法(基于它们做什么和/或返回),然后使用Dictionary<int,Func<???>>创建整数到方法的映射。

SuperMethod(另一个可怕的方法名称)然后会在字典中查找该方法并执行它。

答案 2 :(得分:1)

void Method1() { Console.WriteLine("M1"); }

void Method2() { Console.WriteLine("M2"); }

void SuperMethod(int nr)
{
    var mi = this.GetType().GetMethod("Method" + nr, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
    mi.Invoke(this, null);
}

答案 3 :(得分:1)

我只想使用带有静态列表或数组的静态类。持续的查找时间和访问,因为整数是你的关键,它的连续字典提供的优势很小。

static class Super
{
    static void M1()
    {
    }
    static void M2()
    {
    }
    static List<Action> Actions = new List<Action>(); 
    static Super()
    {
        Actions.Add(M1);
        Actions.Add(M2); 
    }
    static void CallSupper(int nr)
    {
        try
        {
            Actions[nr - 1](); 
        }
        catch (Exception ex)
        {

        }
    }
}

答案 4 :(得分:0)

在第一个例子中,我可能会重新设计(正如其他人所评论的那样)。

如果你真的想使用反射并假设我们在一个类实例中,你可以这样做

void SuperMethod(int nr)
{   
    MethodInfo methodInfo = type.GetMethod("Method" + nr);
    methodInfo.Invoke(this, null);
}