2016-04-06 58 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

相關問題