2012-06-23 6 views
5

時には私は最も単純なことを理解できません。私はそれが私の顔にあると確信しています。この単純なクラスでメソッドのデリゲートを作成しようとして イム:アクション<>複数のパラメータの構文説明

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以外のスレッドから呼び出しを行う必要があるためです)

おかげで、

あなたはまず、 Action変数にあなたの匿名メソッドを割り当てるメソッドに渡される引数でそれを呼び出す必要が
+0

アクション<>は何も特別なものではなく、.NET Frameworkの「システム」名前空間に含まれる汎用代理人(またはむしろセット)です。 – Marlon

答えて

9

:引数は期待しているので、この場合は

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

ありがとう、私は最終的に、この行動がどのように働いて使用されるのかを最終的に理解しました。 –

2

あなたはact変数に割り当てるべきではないでしょうか。行で何か:

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

だけでなく、あなたがそれを文字列とBalloonTipを受けながら、パラメータとしてそれを匿名メソッドを渡す行為を起動しようとしているようだとして、あなたは、actにメソッドを割り当てませんでした.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; 
} 

・ホープあなたの質問はOKです。がんばろう。