none
如何取事件响应函数的EventHandler对象 RRS feed

  • 问题

  • 比如 ToolStripItem. Click

    public event EventHandler Click

    我想用代码取这个Click事件的响应函数.有没有办法?


    2010年4月27日 7:08

答案

  • 用反射实在是会很复杂....我这会也写不出来。

    如果是你自己定义的事件,建议你扩展一个Event类,然后公开所有响应方法。

    我写过一个扩展,但没有包括这个。

    http://www.cnblogs.com/yedaoq/archive/2010/03/21/1691236.html

    你可以重写添加响应和移除响应的逻辑,将新加的方法添加到一个公有的列表属性中,移除时从列表中删除。

    • 已标记为答案 male110 2010年4月27日 7:44
    • 取消答案标记 male110 2010年4月27日 8:00
    • 已标记为答案 male110 2010年4月27日 8:09
    2010年4月27日 7:43

全部回复

  • 事件有包含响应委托列表的私有成员,委托有包含委托方法列表的私有成员。要获取的话应该只能用反射了。
    2010年4月27日 7:23
  • 反谢 ?

    怎么弄?


    2010年4月27日 7:31
  • 用反射实在是会很复杂....我这会也写不出来。

    如果是你自己定义的事件,建议你扩展一个Event类,然后公开所有响应方法。

    我写过一个扩展,但没有包括这个。

    http://www.cnblogs.com/yedaoq/archive/2010/03/21/1691236.html

    你可以重写添加响应和移除响应的逻辑,将新加的方法添加到一个公有的列表属性中,移除时从列表中删除。

    • 已标记为答案 male110 2010年4月27日 7:44
    • 取消答案标记 male110 2010年4月27日 8:00
    • 已标记为答案 male110 2010年4月27日 8:09
    2010年4月27日 7:43
  • PropertyInfo propertyInfo = (typeof(System.Windows.Forms.Button)).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
                EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(btn_Retrive, null);
                FieldInfo fieldInfo = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
                Delegate d = eventHandlerList[fieldInfo.GetValue(null)];
                if (d != null)
                {
                    foreach (Delegate temp in d.GetInvocationList())
                    {
                        Console.WriteLine(temp.Method.Name);
                    }
                }
    这个是别人获取按钮的,如果是菜单的怎么改?

     PropertyInfo propertyInfo = (typeof(ToolStripMenuItem)).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
                EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(menuTest, null);
                FieldInfo fieldInfo = (typeof(ToolStripMenuItem)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
                object objTemp = fieldInfo.GetValue(null);
                Delegate d = eventHandlerList[objTemp];
                if (d != null)
                {
                    foreach (Delegate temp in d.GetInvocationList())
                    {
                        textBox1.Text += temp.Method.Name + "\r\n";
                    }
                }

    这样不行


    2010年4月27日 8:01
  •  PropertyInfo propertyInfo = (typeof(ToolStripMenuItem)).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
                EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(menuTest, null);
                FieldInfo fieldInfo = (typeof(ToolStripItem)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
                object objTemp = fieldInfo.GetValue(null);
                Delegate d = eventHandlerList[objTemp];
                if (d != null)
                {
                    foreach (Delegate temp in d.GetInvocationList())
                    {
                        textBox1.Text += temp.Method.Name + "\r\n";
                    }
                }
    2010年4月27日 8:11