2012-06-23 54 views
5

有時候我無法理解最簡單的東西,我確定它在我的臉上,我只是看不到它。 我試着在這個簡單的類來創建一個方法的委託:Action <>多個參數的語法澄清

public static class BalloonTip 
{ 
    public static BalloonType BalType 
    { 
     get; 
     set; 
    } 

    public static void ShowBalloon(string message, BalloonType bType) 
    { 
     // notify user 
    } 
} 

現在,這個動作<>應該建立一個沒有實際宣告一個關鍵字爲「代表」的代表,我才明白正確的?然後:

private void NotifyUser(string message, BalloonTip.BalloonType ballType) 
    { 
     Action<string, BalloonTip.BalloonType> act; 
     act((message, ballType) => BalloonTip.ShowBalloon(message, ballType)); 
    } 

這將無法編譯。爲什麼? (順便說一句,我之所以需要這個委託而不是直接調用ShowBalloon(),是因爲調用必須由另一個線程而不是UI創建,所以我想我需要動作<>)

感謝,

+0

Action <>沒有什麼特別之處,它只是一個泛型的委託(或者更確切地說)Microsoft包含在.NET框架的「System」命名空間中。 – Marlon

回答

9

您需要首先你的匿名方法分配給Action變量,然後在傳遞給該方法的參數調用它:

private void NotifyUser(string message, BalloonTip.BalloonType ballType) 
{ 
    Action<string, BalloonTip.BalloonType> act = 
     (m, b) => BalloonTip.ShowBalloon(m, b); 

    act(message, ballType); 
} 

在這種情況下,由於參數期望你Action可變版中有相同的封裝方法,你也可以直接引用的方法:

private void NotifyUser(string message, BalloonTip.BalloonType ballType) 
{ 
    Action<string, BalloonTip.BalloonType> act = BalloonTip.ShowBalloon; 

    act(message, ballType); 
} 
+0

謝謝,我現在終於明白了這個Action應該如何工作和使用。 –

2

你不應該分配給act變量?東西的線路:

Action<string, BalloonTip.BalloonType> act = BalloonTip.ShowBalloon; 

你不僅不是一個方法分配給act,因爲它似乎您試圖調用行爲傳遞一個匿名方法作爲參數,當它接收字符串和BalloonTip .BalloonType。
最後,你應該返回act,因此你的方法獲得了代表對通知方法應該是:

public Action<string, BalloonTip.BalloonType> GetNotificationMethod() { 
    Action<string, BalloonTip.BalloonType> act = BalloonTip.ShowBalloon; 
    return act; 
} 

你也可以把它簡單:

public Action<string, BalloonTip.BalloonType> GetNotificationMethod() { 
    return BalloonTip.ShowBalloon; 
} 

希望我的理解你的問題確定。祝你好運。