如何列出Winforms控件已订阅的所有事件

时间:2018-10-25 07:12:50

标签: c# events eventhandler

已经在此搜索了许多当前文章,并尝试了许多代码和变体,但仍然无法实现我想要的。

在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,但是显然我没有正确地完成操作。

最感谢您的协助。谢谢!

1 个答案:

答案 0 :(得分:0)

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

看看是否正是您想要的...