10

時々私は最も単純なことを理解することができません、私はそれが私の顔にあると確信しています、私はそれを見ることができないだけです。この単純なクラスのメソッドのデリゲートを作成しようとしています:

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

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

さて、このAction <>は、キーワード「delegate」で実際にデリゲートを宣言せずにデリゲートを作成することになっていますが、正しく理解できましたか?それで:

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

これはコンパイルに失敗します。なんで?

(ちなみに、ShowBalloon()を直接呼び出すのではなく、このデリゲートが必要な理由は、UI以外のスレッドから呼び出す必要があるため、Action <>が必要だと考えました)

ありがとう、

4

2 に答える 2

14

最初に匿名メソッドを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);
}
于 2012-06-23T18:57:56.807 に答える
2

act変数に割り当てるべきではありませんか?次の行の何か:

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

にメソッドを割り当てなかっただけでなくact、文字列と BalloonTip.BalloonType を受け取っている間に、パラメータとして匿名メソッドを渡して act を呼び出そうとしているようです。
最後に、 を返す必要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;
}  

あなたの質問がわかりました。幸運を。

于 2012-06-23T19:00:38.360 に答える