使用方法作为变量

时间:2013-06-21 21:34:28

标签: c# variables methods for-loop casting

我有一个输出整数的方法:

public int Random6()
{
    int n = _r.Next (1, 7);
    return n;
}

我有一个调用方法的循环:

public static void DiceLoop()
{
    int result = 0;
    for(int i = 0; i < maxDice; i++)
    {
        result += Random6;
    }
    Console.WriteLine (result);
}

我希望能够编写一次循环,然后使用变量名称传递多个方法。例如:

public static void DiceLoop()
{
    int result = 0;
    for(int i = 0; i < maxDice; i++)
    {
        result += diceType;
    }
    Console.WriteLine (result);
}

其中diceType是一个使用if函数保存方法名称的变量。我知道我不能只有一个方法作为变量。我尝试将diceType作为字符串并将其传递给循环,但由于Random6发出了int,因此无效。我尝试将diceType转换为int,但这不起作用,因为它正在转换方法的名称,而不是它吐出的数字。我该怎么做呢?我只需要一个额外的变量层并在某处投射吗?

2 个答案:

答案 0 :(得分:13)

可以将委托作为变量。您可以将Func<int>参数传递到DiceLoop函数:

public static void DiceLoop(Func<int> getNext) 
{
    int result = 0;
    for(int i = 0; i < maxDice; i++)
    {
        result += getNext();
    }
    Console.WriteLine (result);
}

然后你可以这样称呼:

DiceLoop(Random6);

这是解决您的特定情况的最简单方法。如果你想说,创建一个变量并将其分配给一个委托,你可以这样做:

Func<int> getNext = Random6;
DiceLoop(getNext);

你甚至可以这样使用lambda expressions(a.k.a匿名函数):

Func<int> getNext = () => _r.Next(1, 7);
DiceLoop(getNext);

答案 1 :(得分:2)

为了扩展p.s.w.g的优秀答案,你可以扩展你的骰子滚轮以接受许多方面作为输入:

Func<int,int> getNextX = (x) => _r.Next(1,x+1);

将“Func<int>”读作“返回int的函数”,这样 “Func<int,int>”是一个“将int作为参数并返回int的函数。”

然后,DiceLoop看起来像这样:

public static void DiceLoop(Func<int,int> roller)
{
    int result = 0, maxDice = 20;
    for(int i = 1; i <= maxDice; i++)
    {
        result += roller(i);
    }
    Console.WriteLine (result);
}

这将为您提供从单面模具(?)到20面模具各一卷的总和。