问题
Sometimes I can't understand the simplest things, i'm sure it's in my face, i just fail to see it. Im trying to create a delegate for a method in this simple class:
public static class BalloonTip
{
public static BalloonType BalType
{
get;
set;
}
public static void ShowBalloon(string message, BalloonType bType)
{
// notify user
}
}
Now, this Action<> is supposed to create the delegate without actually declaring one with the keyword "delegate", did I understand correctly? Then:
private void NotifyUser(string message, BalloonTip.BalloonType ballType)
{
Action<string, BalloonTip.BalloonType> act;
act((message, ballType) => BalloonTip.ShowBalloon(message, ballType));
}
This fails to compile. Why?
(By the way, the reason why I need this delegate instead of directly calling ShowBalloon(), is that the calls must be made from another thread than the UI one, so I figured I need the Action<>)
Thanks,
回答1:
You need to first assign your anonymous method to the Action
variable, then invoke it with the arguments passed in to the method:
private void NotifyUser(string message, BalloonTip.BalloonType ballType)
{
Action<string, BalloonTip.BalloonType> act =
(m, b) => BalloonTip.ShowBalloon(m, b);
act(message, ballType);
}
In this case, since the arguments expected by your Action
variable are identical to those of the encapsulated method, you may also reference the method directly:
private void NotifyUser(string message, BalloonTip.BalloonType ballType)
{
Action<string, BalloonTip.BalloonType> act = BalloonTip.ShowBalloon;
act(message, ballType);
}
回答2:
Shouldn't you assign to the act
variable? Something in the lines of:
Action<string, BalloonTip.BalloonType> act = BalloonTip.ShowBalloon;
Not only did you not assign a method to act
, as it seems you are trying to invoke act passing it a anonymous method as a parameter, while it receives a string and a BalloonTip.BalloonType.
In the end, you should return act
, and thus your method to get a delegate to the notification method should be:
public Action<string, BalloonTip.BalloonType> GetNotificationMethod() {
Action<string, BalloonTip.BalloonType> act = BalloonTip.ShowBalloon;
return act;
}
You can also make it simpler:
public Action<string, BalloonTip.BalloonType> GetNotificationMethod() {
return BalloonTip.ShowBalloon;
}
Hope I understood your question ok. Good luck.
来源:https://stackoverflow.com/questions/11172089/action-multiple-parameters-syntax-clarification