2009-04-02 5 views
1

Le .NET EventHandler est limité aux modèles qui héritent de EventArgs. Comment cela est-il fait? La mise en œuvre (Got to Refference en contre) montre le code suivant:Délégué C# Typeresticted avec le modèle

[Serializable] 
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e); 

Mais je pense que TEventArgs est juste un nom. Comment puis-je écrire un délégué typé qui est limité à tout ce qui hérite de MyClass?

+0

Je peux voir la solution en 2 secondes si je regarde le code de Jon Skeet. J'ai utilisé les deux réponses et je ne veux pas manquer le lien vers la documentation, mais je ne peux marquer qu'une réponse comme correcte. – Tarion

+0

Pour ajouter le lien n'est pas une faute;) Mais écrire la partie évidente vers le bas, aussi. – Tarion

Répondre

5

TEventArgs est un paramètre de type générique - mais il a une contrainte. La signature réelle est:

[Serializable] 
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e) 
    where TEventArgs : EventArgs 

Le « where TEventArgs : EventArgs » bit est la contrainte de type qui signifie que vous ne pouvez fournir un argument de type pour TEventArgs qui est EventArgs ou une classe dérivée.

Fondamentalement, il s'agit simplement de génériques C# "normaux", appliqués uniquement à une déclaration de délégué.

Questions connexes