10

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

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

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

现在,这个 Action<> 应该创建委托而不用关键字“委托”实际声明一个委托,我理解正确吗?然后:

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,而且您似乎正在尝试调用 act 并将匿名方法作为参数传递给它,同时它接收字符串和 BalloonTip.BalloonType。
最后,您应该 return 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 回答