web-dev-qa-db-fra.com

Événement C # avec des arguments personnalisés

Je veux avoir un événement qui prend uniquement une énumération comme argument. Par exemple

public enum MyEvents{
   Event1
}

// how do I declare this to take enum MyEvents as argument
public static event EventHandler EventTriggered;

public static void Trigger(MyEvent event )
{
    if (EventTriggered != null)
    {
        EventTriggered(event);
    }
}
39
Kenoyer130

Vous déclarez un délégué pour les paramètres:

public enum MyEvents { Event1 }

public delegate void MyEventHandler(MyEvents e);

public static event MyEventHandler EventTriggered;

Bien que tous les événements du cadre prennent un paramètre qui est ou dérive de EventArgs, vous pouvez utiliser tous les paramètres que vous aimez. Cependant, les gens sont susceptibles d'attendre le modèle utilisé dans le cadre, ce qui pourrait rendre votre code plus difficile à suivre.

23
Guffa

EventHandler reçoit EventArgs comme paramètre. Pour résoudre votre problème, vous pouvez créer votre propre MyEventArgs.

 public enum MyEvents
 { 
    Event1 
 }

 public class MyEventArgs : EventArgs
 {
    public MyEvents MyEvent { get; set; }
 }

 public static event EventHandler<MyEventArgs> EventTriggered; 

 public static void Trigger(MyEvents ev) 
 { 
     if (EventTriggered != null) 
     {
         EventTriggered(null, new MyEventArgs { MyEvent = ev });
     } 
 } 
62
Cheng Chen

Je suis peut-être en retard dans le jeu, mais que diriez-vous:

public event Action<MyEvent> EventTriggered = delegate { }; 

private void Trigger(MyEvent e) 
{ 
     EventTriggered(e);
} 

Définir l'événement sur un délégué anonyme évite que je vérifie si l'événement n'est pas nul.

Je trouve que cela est utile lors de l'utilisation de MVVM, comme lors de l'utilisation de la méthode ICommand.CanExecute.

12
Steve Brother

Vous devez déclarer un gestionnaire d'événements personnalisé.

public class MyEventArgs: EventArgs
{
  ...
}

public delegate void MyEventHandler(object sender, MyEventArgs e);

public class MyControl: UserControl
{
  public event MyEventHandler MyEvent;
   ...
}
5
Hogan

Voici une refonte de votre échantillon pour vous aider à démarrer.

  • votre échantillon a un événement statique - il est plus courant qu'un événement provienne d'une instance de classe, mais je l'ai laissé statique ci-dessous.

  • l'exemple ci-dessous utilise également la dénomination plus standard OnXxx pour la méthode qui déclenche l'événement.

  • l'exemple ci-dessous ne prend pas en compte la sécurité des threads, ce qui pourrait bien être plus problématique si vous insistez pour que votre événement soit statique.

.

public enum MyEvents{ 
     Event1 
} 

public class MyEventArgs : EventArgs
{
    public MyEventArgs(MyEvents myEvents)
    {
        MyEvents = myEvents;
    }

    public MyEvents MyEvents { get; private set; }
}

public static class MyClass
{
     public static event EventHandler<MyEventArgs> EventTriggered; 

     public static void Trigger(MyEvents myEvents) 
     {
         OnMyEvent(new MyEventArgs(myEvents));
     }

     protected static void OnMyEvent(MyEventArgs e)
     {
         if (EventTriggered != null)
         {
             // Normally the first argument (sender) is "this" - but your example
             // uses a static event, so I'm passing null instead.
             // EventTriggered(this, e);
             EventTriggered(null, e);
         } 
     }
}
3
Joe
public enum MyEvents
{
    Event1
}

public class CustomEventArgs : EventArgs
{
    public MyEvents MyEvents { get; set; }
}


private EventHandler<CustomEventArgs> onTrigger;

public event EventHandler<CustomEventArgs> Trigger
{
    add
    {
        onTrigger += value;
    }
    remove
    {
        onTrigger -= value;
    }
}

protected void OnTrigger(CustomEventArgs e)
{
    if (onTrigger != null)
    {
        onTrigger(this, e);
    }
}
1
Steve Michelotti

Exemple sans paramètres:

delegate void NewEventHandler();
public event NewEventHandler OnEventHappens;

Et à partir d'une autre classe, vous pouvez vous abonner à

otherClass.OnEventHappens += ExecuteThisFunctionWhenEventHappens;

Et déclarez cette fonction sans paramètres.

0
darkgaze