如何将事件和反射联系起来

本文关键字:反射 联系 起来 事件 | 更新日期: 2023-09-27 18:21:28

请参阅下面的示例。我需要将通过反射获得的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.");
    }
}

如何将事件和反射联系起来

您需要创建一个委托:

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

第二个参数是要将委托绑定到的实例。
有关更多信息,请参阅我的博客。

与任何其他委托一样,只有当目标方法具有与委托相同的签名(参数类型)时,这才会起作用。

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

public void DoSomething(object sender, EventArgs e)

你可以订阅这样的活动:

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