2012-06-23 20 views
5

A veces no puedo entender las cosas más simples, estoy seguro de que está en mi cara, simplemente no lo veo. Im tratando de crear un delegado de un método de esta clase simple:Acción <> múltiple aclaración de sintaxis de parámetros

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

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

Ahora bien, esta acción < se supone> ​​para crear el delegado sin tener que declarar una con la palabra clave "delegado", ¿le he entendido bien? Luego:

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

Esto no se puede compilar. ¿Por qué?

(Por cierto, la razón por la que necesito este delegado en lugar de llamar directamente ShowBalloon(), es que las llamadas deben realizarse desde otro hilo de la interfaz de usuario de uno, así que pensé que necesitan la acción <>)

Gracias,

+0

Acción <> no tiene nada de especial, es solo un delegado genérico (o un conjunto de más) de Microsoft incluido en el espacio de nombres "Sistema" en .NET Framework. – Marlon

Respuesta

9

es necesario asignar primero el método anónimo a la variable Action, a continuación, lo debe invocar con los argumentos pasados ​​al método:

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

    act(message, ballType); 
} 

en este caso, ya que los argumentos esperan ed por la variable de Action son idénticos a los del método de encapsulado, también puede hacer referencia al método directo:

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

    act(message, ballType); 
} 
+0

Gracias, ahora finalmente entendí cómo se supone que esta Acción funciona y se debe usar. –

2

no debe usted asignar a la variable act? Algo en la línea de:

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

No sólo no se asigne un método para act, ya que parece que está intentando invocar acto de pasarlo un método anónimo como un parámetro, al tiempo que recibe una cadena y una BalloonTip .BalloonType.
Al final, usted debe volver act, y por lo tanto su método para obtener un delegado al método de notificación debe ser:

public Action<string, BalloonTip.BalloonType> GetNotificationMethod() { 
    Action<string, BalloonTip.BalloonType> act = BalloonTip.ShowBalloon; 
    return act; 
} 

También puede hacer que sea más simple:

public Action<string, BalloonTip.BalloonType> GetNotificationMethod() { 
    return BalloonTip.ShowBalloon; 
} 

esperanza que entiende tu pregunta está bien. Buena suerte.

Cuestiones relacionadas