日期:2014-05-18  浏览次数:21025 次

如何判断事件是否已订阅某一方法
请问如何判断事件是否已订阅某一方法
例如:
button2.Click += new EventHandler(button2_Click);
这样判断button2的Click事件是否已订阅button2_Click这个事件处理方法

------解决方案--------------------
用反射
C# code

ropertyInfo pi = (typeof(System.Windows.Forms.Button)).GetProperty("Events", 
                BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList ehl = (EventHandlerList)pi.GetValue(yourbutton, null);//这是你的Button
FieldInfo fi = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
Delegate d = ehl[fi.GetValue(null)];
if (d != null)
{
    System.Delegate[] dels = d.GetInvocationList();
    for (int i = 0; i < dels.Length; i++)
    {
        Console.WriteLine(dels[i].Method.Name);//这里会输出所有方法名称
    } 
}

------解决方案--------------------
我觉得没有特别的需求情况下没必要知道所有的方法吧??
你只要在加事件之前先-=就好了
button2.Click -= new EventHandler(button2_Click); 
button2.Click += new EventHandler(button2_Click);
------解决方案--------------------
C# code


 Delegate[] delDirectory = button2.Click.GetInvocationList();
            if (delDirectory != null && delDirectory.Length > 0)
            {
                foreach (EventHandle handle in delDirectory)
                {
                    if (handle == button2_Click)
                    {
                        //已注册
                    }
                    else
                    {
                        //未注册
                    }
                }
            }
            else
            {
                //未注册
            }

------解决方案--------------------
简单点话 注册事件 先移除 然后在注册
 或者可以到事件列表里面去判断是否存在该事件 例如 Zine_Alone 所说的