En C# Comment créez-vous un événement avec un gestionnaire d'événements personnalisé dans le cadre d'une interface?

Quel est le format correct pour déclarer un gestionnaire d'événements dans une interface si vous utilisez une sous-classe personnalisée de EventHandler plutôt que la classe EventHandler de base.

Je crée la sous-classe EventHandler MyEventHandler par exemple dans la déclaration de délégué, mais vous ne pouvez pas déclarer un délégué dans une interface...

Lorsque je demande à Visual Studio D'extraire une interface, il fait référence au gestionnaire D'événements dans IMyClassName comme MyClassName.MyEventHandler qui joue évidemment des ravages avec type d'accouplement.

Je suppose qu'il existe un moyen simple de le faire, dois-je déclarer explicitement mon gestionnaire d'événements dans un fichier séparé?

22
demandé sur Omar Kooheji 2009-02-25 15:42:47

2 réponses

Eh bien, vous devez définir les arguments et éventuellement déléguer quelque part. Vous n'avez pas besoin de un deuxième fichier, mais je le recommanderais probablement... mais les classes ne devraient probablement pas être imbriquées , Si c'était le problème d'origine.

La recommandation est d'utiliser le modèle standard "sender, args"; il existe deux approches cmmon:

1: déclarer une classe event-args séparément, et utiliser EventHandler<T> sur l'interface:

public class MySpecialEventArgs : EventArgs {...}
...
EventHandler<MySpecialEventArgs> MyEvent;

2: déclarer une classe event-args et déléguer type séparément:

public class MySpecialEventArgs : EventArgs {...}
public delegate void MySpecialEventHandler(object sender,
    MySpecialEventArgs args);
....
event MySpecialEventHandler MyEvent;
25
répondu Marc Gravell 2009-02-25 12:47:33

En supposant C # 2.0 ou version ultérieure...

public class MyEventArgs: EventArgs
{
    // ... your event args properties and methods here...
}

public interface IMyInterface
{
    event EventHandler<MyEventArgs> MyEvent;
}
15
répondu Mike Scott 2009-02-25 12:49:57