2016-04-06 59 views
0

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

如何将值传递给动作?

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? 
    } 

回答

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解决您的问题。

+0

完美谢谢。 – user3363744

1

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

在这些情况下,您可以简单地将您的方法定义为Action,而不是定义Action<T>哪种类型的关系能够使用闭包。所以test应该是这样的:

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

所以你怎么会在参数(S)通过了吗?简单:使用闭包。就像这样:

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); 
} 

当我们的上下文切换(又名线程跳跃),并需要延续线程在它执行点拿起一个或多个变量的值,我们经常使用这种方法。这只是一个例子,还有其他一些有效的用例。

您的实验性例子,如果我正确阅读,也可以作为封闭可能很适合的情况。

+0

谢谢,有道理。 – user3363744

相关问题