从事件中获取委托处理程序

Get delegate handler from event

我试图在不对 MyControl class 进行任何更改的情况下获取事件处理程序。我尝试使用反射,但无法获得处理程序。 以下是代码示例。 谢谢

public class MyControl : Control
{
    public void Register()
    {
        SizeChanged += MyControl_SizeChanged;
    }

    void MyControl_SizeChanged(object sender, EventArgs e)
    {
        // Do something
    }
}

//[TestFixture]
public class MyControlTest
{
    //  [Test]
    public void RegisterTest()
    {

        var control = new MyControl();
        control.Register();

        var eventInfo = control.GetType().GetEvent("SizeChanged", BindingFlags.Public | BindingFlags.Instance);

        // Need to get the handler (delegate) and GetInvocationList().Count
        EventHandler handler = ...;

        var count = handler.GetInvocationList().Count();
        Assert.That(count, IsolationLevel.EqualTo(1));
    }
}

这可能是因为它的保护级别目前是 private 从您发布的代码中可以看出

void MyControl_SizeChanged(object sender, EventArgs e)
{
    // Do something
}

事件实际上没有处理程序;事件只是一对特别命名的添加和删除方法。
有关详细信息,请参阅 my blog

事件如何存储其处理程序是一个实现细节; WinForms 控件使用 EventHandlerList.
你可以在 the source.

中看到这个