2012-08-31 43 views
0

我想弄清楚如何正確使用一個Action委託,需要多個(通過十個)類型的參數,如下所示:Action <T,T,T>如何工作?

Action<T,T,T>例如。

比方說,我用下面的函數原型:

public void SomeFunc(Action<bool, int> foo)

我如何去傳遞一個布爾值和一個整數值調用該函數時,foo的?也許我只是把整個事情弄錯了,但是當我在MSDN和其他資源上查看時,我無法理解這個事情是如何實際運作的。其Func<TReturn, T, T>相同。

MSDN提出了一些非常難以理解的例子,我希望這裏的某個人能真正向我展示這些代表如何正確實現的例子。謝謝。

+0

隨着'Func',順序是周圍的其他方法:['Func鍵'](http://msdn.microsoft.com/en-us/library/bb534647) 。 – svick

回答

4

可以使用lambda這樣的:

SomeFunc((a1, a2) => { 
    Console.WriteLine(string.Format("params: {0}, {1}", a1, a2)); 
}); 

或者,如果你已經有了該委託匹配的功能,你可以直接通過。

void SomeFunc(Action<bool,int> foo) 
{ 
    foo(true, 99); 
    // stuff 
} 

void matchesDelegate(bool a1, int a2) 
{ 
    Console.WriteLine(string.Format("params: {0}, {1}", a1, a2)); 
} 

SomeFunc(matchesDelegate); 

輸出

PARAMS:真,99

+0

@KirkWoll謝謝......「匿名方法」是我猜我在想什麼。 – McGarnagle

+0

謝謝,這完全解釋了它! – aevitas

1

如果foo是Action<bool, t>你可以用foo(true, 42)

調用它。如果你想調用SomeFunc,你可以用一種方法調用它:

SomeFunc(MyMethod); 

,你必須:

public void MyMethod(bool b, int i){} 

或者您也可以與匿名方法調用它:

SomeFunc(delegate(bool b, int i) {Trace.WriteLine(b); Trace.WriteLine(i);}); 

或者你可以用一個lambda稱之爲:

someFunc((b,i) => {Trace.WriteLine(b); Trace.WriteLine(i);}); 
2

隨着像以下簽名:

public void SomeFunc(Action<bool, int> foo) 

您致電SomeFunc並只傳入一個參數 - 一個採用兩個參數的操作。因爲這就是它的實際情況,所以將該操作看作回調方法。在SomeFunc方法的某處,它將調用foo並傳入那裏的參數。你不需要自己提供它們。

2

ActionFunc代表與其他代表一樣工作。簡單Action代表基本上是這樣:

public delegate void Action(); 

,被稱爲像這樣:

public void doAction(Action foo) 
{ 
    Action(); // You call the action here. 
} 

使用通用參數,定義基本上看起來像:

public delegate void Action(T1, T2, T3); 

,被稱爲像以下將參數傳遞給動作:

public void SomeFunc(Action<bool,int> foo) 
{ 
    bool param1 = true; 
    int param2 = 69; 
    foo(param1, param2); // Here you are calling the foo delegate. 
} 

就像其他的代表,這些代表可以明確定義的功能分配,

public void AnAction() 
{ 
    Console.WriteLine("Hello World!"); 
} 

doAction(AnAction); 

或匿名函數。

Action<bool,int> anonymousAction = (b,i) => 
{ 
    if (b == true && i > 5) 
     Console.WriteLine("Hello!"); 
    else 
     Console.WriteLine("Goodbye!"); 
} 
SomeFunc(anonymousAction); 
相關問題