动作及LT;>多参数语法澄清

时间:2012-06-23 18:50:17

标签: c# action notifyicon

有时我无法理解最简单的事情,我确信这是在我的脸上,我只是没有看到它。 我试图在这个简单的类中为方法创建一个委托:

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&lt;&gt;)< / p>

谢谢,

2 个答案:

答案 0 :(得分:10)

您需要首先将您的匿名方法分配给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);
}

答案 1 :(得分: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;
}  

希望我理解你的问题。祝你好运。