从事件

时间:2015-08-12 15:10:12

标签: c# events reflection delegates eventhandler

我试图获取事件处理程序而不在MyControl类中进行任何更改。我试图使用反射,但我无法获得处理程序。 以下是代码示例。 感谢

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));
    }
}

2 个答案:

答案 0 :(得分:1)

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

事件如何存储其处理程序是一个实现细节; WinForms控件使用EventHandlerList 您可以在the source中看到这一点。

答案 1 :(得分:0)

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

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