如何用反射连接事件

时间:2013-07-07 17:13:47

标签: c# reflection

见下面的样本。我需要将通过反射获得的DoSomething方法连接到事件。

    class Program {
    private static event EventHandler MyEvent;

    static void Main(string[] args)
    {
        object aType = new SomeType();

        var type = aType.GetType();

        var method = type.GetMethod("DoSomething");

        if (method != null)
        {
            MyEvent += method;//How do I wire this up?
        }
    }
}


public class SomeType {
    public void DoSomething() {
        Debug.WriteLine("DoSomething ran.");
    }
}

2 个答案:

答案 0 :(得分:4)

您需要创建一个委托:

MyEvent += (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), aType, method);

第二个参数是将委托绑定到的实例 有关详细信息,请参阅my blog

与任何其他委托一样,这仅在目标方法与委托具有相同签名(参数类型)时才有效。

答案 1 :(得分:4)

实际上,您不能将DoSomething用作MyEvent的处理程序,因为它没有正确的签名。假设您将DoSomething的签名更改为:

public void DoSomething(object sender, EventArgs e)

您可以订阅此类活动:

    if (method != null)
    {
        var dlg = (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), aType, method);
        MyEvent += dlg;
    }