使用Reflection订阅活动

时间:2010-11-05 09:42:21

标签: .net events reflection

我有一个非常简单的课程:

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

我希望这个类订阅一个事件,例如表单控件的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

        }
    }
}

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

谢谢!

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

对不起编辑,它工作得非常好:))

2 个答案:

答案 0 :(得分:9)

通过一些更改,我能够执行您的样本。

首先,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 :(得分: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);