Как передать параметры в метод с помощью отражения - PullRequest
0 голосов
/ 30 ноября 2010

В дополнение к мой предыдущий вопрос , я хочу передать параметры в метод "WriteTrace".Но я не знаю, как это сделать.

Вот фактический код:

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

Теперь я хочу получить некоторую информацию в след:

  • Имя элемента управления
  • Имя события

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

Создать ли класс TraceEventArgs, производный от EventArgs, с этой информацией?Как передать эту информацию в методе SubscribeEvent?

Спасибо за вашу помощь,

Florian

EDIT

Извините, здесьтеперь ссылка на «мой предыдущий вопрос»: Подписаться на событие с Reflection

1 Ответ

1 голос
/ 30 ноября 2010

Попробуйте что-то вроде этого:

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