Flo*_*ian 8 .net reflection events
我有一个非常简单的课程:
class Trace
{
void WriteTrace()
{
Console.WriteLine("Trace !");
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这个类订阅一个事件,例如表单控件的load事件.控件和事件是动态定义的,所以我想使用反射来做到这一点我正在尝试这样的事情:
在我的类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
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后一行出错:绑定到目标方法时出错.我的片段有什么问题?
谢谢 !
编辑:好的,没有更多的错误但是当从Form中引发事件"Load"时,方法WriteTrace没有被调用(我已经放置了一个断点,但没有到达).为什么?
对不起编辑,它工作得很好:)
通过一些更改,我能够执行您的示例.
首先,方法Trace必须有不同的签名才能与EventHandler类型对应:
public class Trace
{
public void WriteTrace(object sender, EventArgs e)
{
Console.WriteLine("Trace !");
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,对以下内容进行了一些更改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);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.