将操作委托作为参数传递给C#

时间:2017-01-26 09:04:36

标签: c# delegates

我有一个接受Action委托并执行给定方法的方法,如下所示:

public void ExpMethod(Action inputDel)
{
    inpuDel();
}

我可以这样调用上面给出的方法:

ExpMethod(() => {/*do something that matters*/});

一切正常。到现在为止还挺好。现在我想要一个将通用Action委托作为输入参数的方法 - 像这样:

public void ExpGenMethod(Action<string,int> inputDel)
{
    // I don't know how to call the supplied delegate as it requires parameters
}

另外,我试图以这种方式调用此ExpGenMethod

ExpGenMethod(("Hi",1) => {/*do something that makes sense*/});

但它显示语法错误。在这种情况下,请告诉我如何使用通用操作委托?

4 个答案:

答案 0 :(得分:6)

委托的关键是要有一个指向方法的指针。在声明它的同时将参数传递给它是没有意义的。而是在{em>执行委托的方法中传递您的委托的参数,在ExpGenMethod的情况下:

你应该这样做:

public void ExpGenMethod(Action<string,int> inputDel)
{
    inputDel("Hi", 1);
}

并称之为:

ExpGenMethod((x, y) => {/*do something that makes sense*/});

执行该委托时,x评估为"Hi"y评估为1

答案 1 :(得分:2)

(a,b) => {/*do something that matters*/}表示a和b是在调用期间指定的参数。在这里你使用常量,所以你应该做() => { use "Hi"; use 1;}这样的事情,这会让你回到你的第一个工作实例。

如果你想传递参数,你可以这样做:

public void work()
{
    ExpGenMethod((a) => {/*do something that matters*/});
}

public void ExpGenMethod(Action<int> inputDel, int parameterToUse)
{
    inputDel(parameterToUse);
}

答案 2 :(得分:0)

通常,您会希望在 ExpGenMethod中进行繁重的工作,而在委托本身中,您只是将参数传递给ExpGenMethod。

using System;

public class Program
{
    public static void Main()
    {
        ExpGenMethod((options) =>
        {
            options.x = "Hi";
            options.y = 1;
        });
    }

    public static void ExpGenMethod(Action<Options> inputDel)
    {
        var options = new Options();
        inputDel(options);
        /* have access to x and y so do some thing useful with these values */
        Console.WriteLine(options.x);
        Console.WriteLine(options.y);
    }
}

public class Options
{
    public string x { set; get;}

    public int y { set; get; }
}

答案 3 :(得分:0)

接着@HimBromBeere 的解释:

关键字 Action 定义为委托:

public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);

所以如果方法定义为:

public void ExpGenMethod(Action<string,int> inputDel)
{
    inputDel("Hi", 1);
}

您可以使用 Lambda 表达式调用带有参数 x,y 的 ExpGenMethod,并使用 Console.Writeline 查看结果,如下所示:

ExpGenMethod((x, y) => { Console.WriteLine($"{x} {y}"); });