2010-11-05 71 views
7

我有一个非常简单的类:订阅事件与反思

class Trace 
{ 
    void WriteTrace() 
    { 
     Console.WriteLine("Trace !"); 
    } 
} 

我想这个类订阅事件,例如表单控件的加载事件。控制和事件是动态定义,所以我想使用反射来做到这一点,我想这样的事情:

在我的课堂跟踪我有这样的方法:

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

      // Subscribe to the event 
      EventInfo eventInfo = control.GetType().GetEvent("Load"); // We suppose control is a form 
      Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, control, method); // ERROR : Error binding to target method 

     } 
    } 
} 

有一个错误的最后一行:错误绑定到目标方法。我的代码段出了什么问题?

谢谢!

编辑:好吧,没有更多的错误,但当从窗体中引发事件“Load”时,方法WriteTrace不会被调用(我已经放置了一个断点但没有到达)。为什么?

对不起,编辑,它的工作原理很细:)

+0

为什么你想要使用反射,如果你只能订阅/添加处理程序的事件? 'control.Load + = HandlerHere;'...另一方面,你是否曾经用'Form'代替Control?因为你首先在谈论一个表单。 – Bobby 2010-11-05 09:53:22

+0

这只是一个例子,但我应该能够选择控制和事件追踪。 – Florian 2010-11-05 10:27:14

回答

8

通过一些更改,我能够执行您的示例。

首先,在Trace方法必须有不同的特征与所述EventHandler类型一致:

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

下,一些变化在SubscribeEvent提出:

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

我希望这帮助。

1

你的第一个问题是Trace.WriteTrace方法签名不匹配Form.Load事件处理程序的语法

试试这个:

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

而且,你的电话createDelegate方法需要通过跟踪对象,而不是控制对象:

Trace test = this; 
MethodInfo method = typeof(Trace).GetMethod("WriteTrace"); 

// Subscribe to the event 
EventInfo eventInfo = control.GetType().GetEvent("Load"); // We suppose control is a form 

Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, method); // ERROR : Error binding to target method 
eventInfo.AddEventHandler(control, handler);