0

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

2 回答 2

4

您需要创建一个委托:

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

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

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

于 2013-07-07T17:17:46.757 回答
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;
    }
于 2013-07-07T17:20:06.773 回答