比如一个button1,有如下的委托事件
button1.Click += new System.EventHandler(this.menuClick);        private void menuClick(object sender, EventArgs e)
        { 
        
        }怎么能根据事件"menuClick"获取到button1对象.

解决方案 »

  1.   

    Button button1=sender as Button;
      

  2.   

            private void menuClick(object sender, EventArgs e) 
            { 
            
            } 
      

  3.   

    反射场景描述的详细点你是想获取运行时的实参?有没有试过:
    public class StackFrame
        Member of System.Diagnostics
      

  4.   


    没有写明白
    另外还有若干个button也引用了这个委托,怎么在一个方法内,将这些引用的button找到,而不是在这个事件内找到.
      

  5.   


      foreach (Delegate delItem in Click.GetInvocationList())
                    {
                        delItem.Target
                      
                    }
      

  6.   


            List<Button> GetMethodObject(string method)
            {
                List<Button> list = new List<Button>();
                PropertyInfo pi = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
                foreach (FieldInfo fi in this.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static))
                {
                    if (fi.FieldType == typeof(Button))
                    {
                        Button btn = fi.GetValue(this) as Button;
                        EventHandlerList ehl = pi.GetValue(btn, null) as EventHandlerList;
                        object key = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
                        Delegate del = ehl[key];
                        foreach (Delegate de in del.GetInvocationList())
                            if (de.Method.Name == method)
                                list.Add(btn);
                    }
                }
                return list;
            }
      

  7.   

    我扩展了一下button类型,马上结贴        private List<Control> GetMethodObject(string method)
            {
                List<Control> list = new List<Control>();
                PropertyInfo pi = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
                foreach (FieldInfo fi in this.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static))
                {
                    if (fi.FieldType == typeof(Button))
                    {
                        Control btn = fi.GetValue(this) as Control;
                        EventHandlerList ehl = pi.GetValue(btn, null) as EventHandlerList;
                        object key = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
                        Delegate del = ehl[key];
                        foreach (Delegate de in del.GetInvocationList())
                            if (de.Method.Name == method)
                                list.Add(btn);
                    }
                }
                return list;
            }
      

  8.   

    if (fi.FieldType == typeof(Button)) 
    =>
    if (fi.FieldType == typeof(Control)) 
      

  9.   

    最终的版本        private List<Control> GetMethodObject(string method)
            {
                List<Control> list = new List<Control>();
                PropertyInfo pi = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
                foreach (FieldInfo fi in this.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static))
                {
                   
                    if (fi.FieldType.IsSubclassOf(typeof(Control)))
                    {
                        Control ctl = fi.GetValue(this) as Control;
                        EventHandlerList ehl = pi.GetValue(ctl, null) as EventHandlerList;
                        object key = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
                        Delegate del = ehl[key];
                        if (del != null)
                        {
                            foreach (Delegate de in del.GetInvocationList())
                            {
                                if (de.Method.Name == method)
                                    list.Add(ctl);
                            }
                        }
                    }
                }
                return list;
            }