2009-09-02 7 views
0

Je travaille sur un EventRegistry qui permet d'enregistrer certains gestionnaires d'événements. Chaque fois qu'un événement est déclenché, il vérifie s'il y a un abonné pour cet événement et l'invoque.comment ajouter un gestionnaire d'événement générique à l'exécution

interface IEventRegistry 
{ 
void Subscribe<TEventArgs>(Type eventType,EventHandler<TEventArgs> subscriber) where TEventArgs:EventArgs 
void Publish<TEventArgs>(Type eventType,object sender,TEventArgs args) where TEventArgs:EventArgs 
} 

De cette façon, j'inscrire mes abonnés un par one.I pensent qu'il est une sorte de travail qui peut être automatisé à l'aide par exemple reflection.For s'il y a une classe de type contrôleur qui a des méthodes OnXXX I'D comme pour les abonner automatiquement:

foreach(var type in assembly.GetTypes()) 
{ 
if((typeof(Controller).IsAssginableFrom(type)) 
foreach(var methodInfo in type.GetMethods()) 
{ 
if(methodInfo.Name.StartsWith("On")) 
    // Subscribe method 
} 

La question est que, puisque j'utilise une méthode générique pour souscrire des gestionnaires d'événements comment est-il possible d'appeler à l'aide d'un type donné lors de l'exécution? En fait, je ne sais pas comment appeler la méthode Subscribe de EventRegistry en raison de certaines entrées par réflexion au moment de l'exécution.

+3

Etes-vous sûr que toute méthode commençant par "Oui" est admissible? Je pense que c'est une hypothèse plutôt dangereuse à faire. Je vous recommande d'ajouter un attribut personnalisé à toutes les fonctions que vous souhaitez inclure dans une recherche par réflexion. C'est un peu plus typé, mais beaucoup plus sûr. –

+0

@David: Je sais que c'est juste un exemple – Beatles1692

+1

duplication possible de [Comment utiliser la réflexion pour appeler la méthode générique?] (Http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call- generic-method) – nawfal

Répondre

0

J'ai trouvé ma réponse here

En fait, il semble qu'il ya des méthodes MakeGenericXXX qui nous aident à travailler avec les génériques utilisant la réflexion.

0

Utilisez Type.InvokeMember pour appeler des méthodes sur une instance. Ou, si vous êtes préoccupé par les performances, mettez en cache un ensemble de délégués qui pointent vers les procédures que vous devez appeler.

0

Je pense que la meilleure approche serait d'utiliser un attribut personnalisé puisque vous pouvez alors chercher des méthodes avec l'attribut spécifique à l'exécution.

+0

Je peux utiliser des attributs pour trouver mes méthodes de gestionnaires d'événements mais j'ai quand même le problème de les abonner. En fait je ne sais pas comment appeler la méthode Subscribe de EventRegistry à l'exécution – Beatles1692

Questions connexes