2010-11-30 7 views
0

En plus de my precedent question, je souhaite passer des paramètres à la méthode "WriteTrace". Mais je ne sais pas comment faire ça.Comment passer des paramètres à une méthode par réflexion

Voici le code actuel:

public class Trace 
{ 
    public void WriteTrace(object sender, EventArgs e) 
    { 
     Console.WriteLine("Trace !"); 
    } 
} 



public void SubscribeEvent(Control control) 
{ 
    if (typeof(Control).IsAssignableFrom(control.GetType())) 
    { 
     Trace test = this; 
     MethodInfo method = typeof(Trace).GetMethod("WriteTrace"); 

     EventInfo eventInfo = control.GetType().GetEvent("Load"); 

     // Create the delegate on the test class because that's where the 
     // method is. This corresponds with `new EventHandler(test.WriteTrace)`. 
     Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, test, method); 
     // Assign the eventhandler. This corresponds with `control.Load += ...`. 
     eventInfo.AddEventHandler(control, handler); 
    } 
} 

Maintenant, je veux obtenir des infos dans la trace:

  • Le nom du contrôle
  • Le nom de l'événement

    public void WriteTrace(object sender, EventArgs e) 
    { 
        Console.WriteLine("Control : " + e.ControlName + "Event : " + e.EventName); 
    } 
    

Est-ce que je crée une classe TraceEventArgs dérivée de EventArgs avec ces informations? Comment passer ces infos dans la méthode SubscribeEvent?

Merci pour votre aide,

Florian

EDIT

Désolé, voici maintenant la référence à "ma question précédente": Subscribe to an event with Reflection

Répondre

1

Essayez quelque chose comme ceci:

public void WriteTrace(object sender, EventArgs e, string eventName) 
{ 
    Control c = (Control)sender; 
    Console.WriteLine("Control: " + f.Name + ", Event: " + eventName); 
} 

public void SubscribeEvent(Control control, string eventName) { 
    EventInfo eInfo = control.GetType().GetEvent(eventName); 

    if (eInfo != null) { 
     // create a dummy, using a closure to capture the eventName parameter 
     // this is to make use of the C# closure mechanism 
     EventHandler dummyDelegate = (s, e) => WriteTrace(s, e, eventName); 

     // Delegate.Method returns the MethodInfo for the delegated method 
     Delegate realDelegate = Delegate.CreateDelegate(eInfo.EventHandlerType, dummyDelegate.Target, dummyDelegate.Method); 

     eInfo.AddEventHandler(control, realDelegate); 
    } 
} 
+0

J'oublie d'ajouter un lien à ma question précédente. Je suppose qu'un contrôle passé est un formulaire (pour les tests): "Je veux que cette classe s'abonne à un événement, par exemple l'événement de chargement d'un contrôle de formulaire Le contrôle et l'événement sont définis dynamiquement donc je veux utiliser la réflexion " Désolé pour la confusion – Florian

+0

Aaah, gotcha. Édité. – thecoop

+0

Merci beaucoup! – Florian

Questions connexes