将动作传递给通用函数

时间:2016-04-06 23:04:59

标签: c#

我试图通过尝试不同的事情来围绕Csharp中的不同概念。创建一个接受动作的通用函数。该操作有一个输入参数并返回void。我创建了一个链接到lambda函数的简单动作(返回void有一个参数x)。我能够运行该操作但是当我将该函数传递给我的泛型函数时,我不确定如何添加输入参数。 act(“Some Int”)不起作用。

如何将值传递给某个操作?

public MainWindow()
    {
        InitializeComponent();

        Action<int> myAction = (x) => Console.WriteLine(x);
        myAction(13);
        test(myAction);
    }

    private static void test<T>(Action<T> act)
    {
        act(); // How do i pass in an int Here?
    }

2 个答案:

答案 0 :(得分:4)

只需调用act("Some Int"),因为您刚要求Action行为是一个genric函数。因此,您无法使用一个固定变量类型专门调用它。您可以通过修改test - 方法

来解决您的问题
 private static void test<T>(Action<T> act, T value)
 {
    act(value); // How do i pass in an int Here?
 }
 ...
 test(myAction,integerValue);

现在,您可以使用给定的Action值来调用int

答案 1 :(得分:1)

我可以看到你正在尝试做什么,只是想抛出这个模式,因为我们经常在必须使用闭包时执行此操作,并且参数可能会大不相同。

在这些情况下,您可以简单地将方法定义为Action<T>,而不是将Action定义为能够使用闭包的哪种方式。所以test看起来像这样:

private static void test(Action act)
{
    act(); // yup, that's all there is to it!
}

那么你将如何传递参数?简单:使用闭包。像这样:

public MainWindow()
{
    InitializeComponent();

    var x = 13; // this defined outside now...

    Action myAction = () => Console.WriteLine(x); // you're basically using the closure here.

    myAction();

    test(myAction);
}

当我们进行上下文切换(也称为线程跳转)时,我们经常使用这种方法,并且需要线程延续在其执行的点处拾取一个或多个变量值。这只是一个例子,还有其他一些有效的用例。

您的实验示例,如果我正确地阅读它,也可能有资格作为封闭可能适合的情况。