2

Let's say I've got 6 methods: Method1(), Method2(), Method3(), Method4(), Method5() and Method6(). I also have another method, SuperMethod(int nr), that will call one of the other methods. If the input to SuperMethod is 1, Method1() will be called and so on.

Can this be done in an elegant way without having a switch statement or stacking if-else statements?

I should add that this is not important production code I'm writing, so performance is not an issue.

4

5 回答 5

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]();
    }
于 2012-12-17T15:40:26.430 回答
2

假设我有 6 个方法:Method1()、Method2()...

然后你有可怕的方法名称。我会适当地命名这些方法(基于它们所做的和/或return),然后使用Dictionary<int,Func<???>>.

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

于 2012-12-17T15:44:49.173 回答
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);
}
于 2012-12-17T15:40:50.197 回答
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)
        {

        }
    }
}
于 2012-12-17T15:46:38.610 回答
0

首先,我可能会重新考虑设计(正如其他人所评论的那样)。

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

void SuperMethod(int nr)
{   
    MethodInfo methodInfo = type.GetMethod("Method" + nr);
    methodInfo.Invoke(this, null);
}
于 2012-12-17T15:38:56.960 回答