2009-05-14 5 views
13

Est-il possible de créer un nouveau type de délégué basé sur un type existant? Dans mon cas, je voudrais créer un délégué MyMouseEventDelegate qui aurait les mêmes fonctionnalités que EventHandler<MouseEventArgs>.Comment créer un nouveau type de délégué basé sur un type existant, en C#?

Pourquoi je veux ça? Pour tirer parti de vérification de type à la compilation, bien sûr! De cette façon, je peux avoir deux délégués différents: MyRightClickHandler et MyLeftClickHandler, et jamais le twain ne doit être confondu - même s'ils sont fonctionnellement identiques à EventHandler<MouseEventArgs>.

Y a-t-il une syntaxe pour faire ce genre de chose?

Oh, et le code comme:

using MyRightClickHandler = EventHandler<MouseEventArgs> 

est pas assez bon. Il ne fait aucune vérification de type, car il ne crée pas réellement un nouveau type. Et je devrais coller une telle ligne dans chaque fichier de code dans lequel je me référerais à MyRightClickHandler.

+1

J'ai modifié le titre pour qu'il soit clair que vous parlez des types de délégué, pas des instances de délégation. J'espère que ça ne vous dérange pas. –

+0

Honoré! Merci. – scraimer

Répondre

10

Eh bien, c'est aussi simple que de copier la déclaration de délégué de l'original. Il n'y a rien en C# pour le faire automatiquement, mais je ne peux pas le voir est beaucoup plus d'un fardeau:

public delegate void MyLeftClickHandler(object sender, MouseEventArgs e); 
public delegate void MyRightClickHandler(object sender, MouseEventArgs e); 

Il est pas comme MouseEventHandler va changer bientôt ...

Avez-vous déjà été mordu par des bugs en raison de l'utilisation des mauvais délégués dans les mauvais endroits si? Je ne me souviens pas d'avoir moi-même trouvé ce problème, et il me semble que vous introduisez plus de travail (et un ensemble de délégués peu familiers pour d'autres développeurs) - êtes-vous sûr que ça en vaut la peine?

+0

Wow. Je suppose que je devrais penser et utiliser le bon sens la prochaine fois :-) – scraimer

+0

Ce n'est pas un fardeau mais cela ne permet pas le polymophisme aux délégués. –

5

Si vous voulez seulement vérifier le type de compilation, je suppose qu'il suffirait de créer des classes EventArgs spécialisées pour les cas que vous décrivez. De cette façon, vous pouvez toujours profiter des délégués pré-définis:

class RightMouseButtonEventArgs : MouseEventArgs {} 
class LeftMouseButtonEventArgs : MouseEventArgs {} 

EventHandler<RightMouseButtonEventArgs> 
EventHandler<LeftMouseButtonEventArgs> 
4

Non Selon le C# documentation, les types de délégués sont scellés, et vous ne pouvez pas créer un nouveau type de délégué qui hérite d'un existant.

3

Je ne croyais pas jon-skeet. Je devais l'essayer pour moi-même. Il avait raison.

public void F(object sender, MouseEventArgs e) {}; 
public MyLeftClickHandler l; 
public MyRightClickHandler r; 
public void Test() 
{ 
    l = F; // Automatically converted. 
    r = F; // Automatically converted to a different type. 
    l = r; // Syntax error. Incompatible types. 
    l = new MyLeftClickHandler(r); // Explicit conversion works. 
} 

Ce n'était pas évident!

Questions connexes