当前位置:  开发笔记 > 编程语言 > 正文

观察控制以确定被触发的事件?

如何解决《观察控制以确定被触发的事件?》经验,为你挑选了1个好方法。

有没有办法列出特定WinForms控件的所有触发事件,而无需为每个可能的事件显式创建处理程序?例如,我可能希望在各种数据绑定操作期间看到在DataGridView和BindingSource之间触发的事件序列.



1> Jon Skeet..:

你可以使用反射,但由于涉及各种事件处理程序签名,它会有点棘手.基本上,您必须获取EventInfo类型中的每个事件,并使用该EventHandlerType属性来计算在调用之前要创建的委托类型AddEventHandler.Delegate.CreateDelegate适用于遵循正常事件处理程序模式的所有内容,但...

这是一个示例应用程序.请注意,它没有进行任何检查 - 如果您使用"非标准"事件给它一些东西,它将抛出异常.你也可以很容易地使用反射打印出事件args.

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Reflection;

namespace ConsoleApp
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Form form = new Form { Size = new Size(400, 200) };
            Button button = new Button { Text = "Click me" };
            form.Controls.Add(button);
            EventSubscriber.SubscribeAll(button);
            Application.Run(form);
        }
    }

    class EventSubscriber
    {
        private static readonly MethodInfo HandleMethod = 
            typeof(EventSubscriber)
                .GetMethod("HandleEvent", 
                           BindingFlags.Instance | 
                           BindingFlags.NonPublic);

        private readonly EventInfo evt;

        private EventSubscriber(EventInfo evt)
        {
            this.evt = evt;
        }

        private void HandleEvent(object sender, EventArgs args)
        {
            Console.WriteLine("Event {0} fired", evt.Name);
        }

        private void Subscribe(object target)
        {
            Delegate handler = Delegate.CreateDelegate(
                evt.EventHandlerType, this, HandleMethod);
            evt.AddEventHandler(target, handler);
        }

        public static void SubscribeAll(object target)
        {
            foreach (EventInfo evt in target.GetType().GetEvents())
            {
                EventSubscriber subscriber = new EventSubscriber(evt);
                subscriber.Subscribe(target);
            }
        }
    }
}

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有