码迷,mamicode.com
首页 > 其他好文 > 详细

C# 反射

时间:2014-08-06 01:22:20      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   for   ar   div   log   

/// <summary>
        /// 清除控件的事件
        /// </summary>
        /// <param name="objectHasEvents"></param>
        /// <param name="EventFiledName"></param>
        public static void ClearAllEvents(Control objectHasEvents, string EventFiledName)
        {
            if (objectHasEvents == null)
            {
                return;
            }
            EventInfo[] events = objectHasEvents.GetType().GetEvents(
                BindingFlags.Public |
                BindingFlags.NonPublic |
                BindingFlags.Instance);
            if (events == null || events.Length < 1)
            {
                return;
            }
            for (int i = 0; i < events.Length; i++)
            {
                try
                {
                    EventInfo ei = events[i];
                    /******************************************************** 
                     * class的每个event都对应了一个同名的private的delegate类 
                     * 型成员变量(这点可以用Reflector证实)。因为private成 
                     * 员变量无法在基类中进行修改,所以为了能够拿到base 
                     * class中声明的事件,要从EventInfo的DeclaringType来获取 
                     * event对应的成员变量的FieldInfo并进行修改 
                     ********************************************************/
                    //FieldInfo fi = ei.DeclaringType.GetField("EVENT_SELECTEDVALUECHANGED", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);

                    FieldInfo fi = null;
                    if (EventFiledName == null)
                        fi = ei.DeclaringType.GetField(ei.Name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
                    else
                        fi = ei.DeclaringType.GetField(EventFiledName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
                    if (fi != null)
                    {
                        // 将event对应的字段设置成null即可清除所有挂钩在该event上的delegate 
                        fi.SetValue(objectHasEvents, null);
                    }
                }
                catch
                {
                }
            }
            if (objectHasEvents is BizMagCardTextBox)
            {
                RemoveEvent(objectHasEvents, "EventEnter", "Enter");
                RemoveEvent(objectHasEvents, "EventKeyPress", "KeyPress");
            }
            if (objectHasEvents is SDUnionICAndMagCard)
            {
                RemoveEvent(objectHasEvents, "EventEnter", "Enter");
            }
            if (objectHasEvents is BizComboBox)
            {
                RemoveEvent(objectHasEvents, "EVENT_SELECTEDINDEXCHANGED", "SelectedIndexChanged");
            }
        }
        /// <summary>
        /// 去掉指定控件的指定事件
        /// </summary>
        /// <param name="con">当前的控件</param>
        /// <param name="eventName">事件名称</param>
        /// <param name="infoName">对应的field名称</param>
        public static void RemoveEvent(Control con, string eventName, string infoName)
        {
            try
            {
                BindingFlags mPropertyFlags = BindingFlags.Instance | BindingFlags.Public
                | BindingFlags.Static | BindingFlags.NonPublic;//筛选
                EventInfo[] events = con.GetType().GetEvents(mPropertyFlags);
                Type type = typeof(Control);
                PropertyInfo propertyInfo = type.GetProperty("Events", mPropertyFlags);
                EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(con, null);//事件列表
                foreach (EventInfo ei in events)
                {
                    if (ei.Name.Equals(infoName))
                    {
                        FieldInfo fieldInfo = ei.DeclaringType.GetField(eventName, mPropertyFlags);
                        Delegate d = eventHandlerList[fieldInfo.GetValue(con)];//获得对应的事件委托
                        if (d == null) return;
                        foreach (Delegate dx in d.GetInvocationList())
                        {
                            ei.RemoveEventHandler(con, dx); //移除对应的事件
                        }
                    }
                }
            }
            catch (Exception ex)
            { }
        }

 

C# 反射,布布扣,bubuko.com

C# 反射

标签:style   blog   color   io   for   ar   div   log   

原文地址:http://www.cnblogs.com/zaqn/p/3893321.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!