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);
}
}
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.
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 });
}
}
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.
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;
...
}
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);
}
}
}
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);
}
}
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.