【问题标题】:How to list all events a Winforms control is subscribed to如何列出 Winforms 控件订阅的所有事件
【发布时间】:2018-10-25 07:12:50
【问题描述】:

在这里搜索了很多关于这个问题的当前文章,并尝试了很多代码和变体,我仍然无法实现我想要的。

在 C# 中,我想将 Winforms 控件传递给一个方法,并让它返回该控件已订阅的任何类型的所有事件处理程序的列表。如果控件订阅了特定事件,则重载方法将简单地返回 true/false。

例如:

Button btn = new Button() ;

private void  evt(object sender, EventArgs e) {}
private void mevt(object sender, MouseEventArgs e) {}

private List<string> GetSubscribedEventList<T>(T item) {}
private bool         CheckEventSubscribed  <T>(T item, string evtName) {}

In Main:

  btn.Click   += new EventHandler(evt) ;
  btn.MouseUp += new MouseEventHandler(mevt) ;

  List<string> events = GetSubscribedEventList(btn) ;
  bool HasClickEvent  = CheckEventSubscribed  (btn,"CLICK") ;

list 方法将返回一个项目列表,这些项目是所有订阅事件的事件名称,列表中的每个项目一个事件。

显然,如果其他形式更灵活,则返回信息的形式可以不是字符串列表。

我需要这样的东西。我已经尝试生成 EventHandlerList 并使用键和 GetInvocationList,但显然我没有正确执行。

非常感谢您的帮助。谢谢!

【问题讨论】:

    标签: c# events eventhandler


    【解决方案1】:
    private void button1_Click(object sender, EventArgs e)
     => GetEvents(button1).ForEach(ev => MessageBox.Show($"Name: {ev.Name}"));
    
    private List<EventInfo> GetEvents(Control control)
      => control.GetType().GetEvents().ToList();
    

    看看是不是你想要的……

    【讨论】:

    • 谢谢。但是,这列出了所有可能的事件。我只想要订阅的事件。因此,例如,如果一个 Button 订阅了两个事件,Click 和 MouseHover,我将只看到这两个事件,而不是所有可能的事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 2011-09-06
    • 2020-03-29
    • 1970-01-01
    • 2018-07-14
    • 2022-11-02
    相关资源
    最近更新 更多