使用方法作为变量

Ama*_*ock 1 c# variables methods for-loop casting

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

public int Random6()
{
    int n = _r.Next (1, 7);
    return n;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

p.s*_*w.g 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);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样称呼:

DiceLoop(Random6);
Run Code Online (Sandbox Code Playgroud)

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

Func<int> getNext = Random6;
DiceLoop(getNext);
Run Code Online (Sandbox Code Playgroud)

你甚至可以用这种方式使用lambda表达式(也就是匿名函数):

Func<int> getNext = () => _r.Next(1, 7);
DiceLoop(getNext);
Run Code Online (Sandbox Code Playgroud)