2010-11-30 8 views
0

Weiter zu my precedent question, ich möchte Parameter an die Methode "WriteTrace" übergeben. Aber ich weiß nicht, wie ich das machen soll.Wie man Parameter zu einer Methode durch Reflexion übergibt

Hier ist der eigentliche Code:

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); 
    } 
} 

Jetzt möchte ich einige Infos in der Spur bekommen:

  • Der Name des Steuer
  • Der Name der Veranstaltung

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

Erstelle ich eine Klasse TraceEventArgs, die von EventArgs mit diesen Informationen abgeleitet ist? Wie diese Informationen in der Methode SubscribeEvent?

Danke für Ihre Hilfe,

Florian

EDIT

Sorry, hier nun der Verweis auf "meine vorherige Frage": Subscribe to an event with Reflection

Antwort

1

etwas Versuchen wie folgt aus:

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

Ich vergesse einen Link zu meiner vorherigen Frage hinzuzufügen. Ich nehme an, dass ein übergebenes Steuerelement ein Formular (für Tests) ist: "Ich möchte, dass diese Klasse ein Ereignis abonniert, zum Beispiel das Ladeereignis eines Formularsteuerelements. Das Steuerelement und das Ereignis werden dynamisch definiert. Daher möchte ich Reflektion verwenden " Sorry für die Verwirrung – Florian

+0

Aaah, Gotcha. Bearbeitet. – thecoop

+0

Vielen Dank !! – Florian

Verwandte Themen