• C# 关于获取控件事件委托列表的一点总结


    -- 反射获取控件事件委托FieldInfo的几种情况总结
    1、通过 ("Event" + EventInfo.Name) 来获取 FieldInfo
    例如: GetField("EventClick") 即可获取控件Click事件委托字段
    2、通过 ("Event" + EventInfo.Name.Replace("Changed","")) 来获取 FieldInfo
    例如: GetField("EventText") 即可获取控件的TextChanged事件委托字段
    3、通过 ("Event" + EventInfo.Name).ToUpper() 来获取 FieldInfo
    例如: GetField("EVENT_SELECTEDINDEXCHANGED") 即可获取控件的SelectedIndexChanged事件委托字段
    4、通过 ("Event" + EventInfo.Name.Replace("Changed","")).ToUpper() 来获取 FieldInfo
    例如: GetField("EVENT_DROPDOWNSTYLE") 即可获取控件的DropDownStyleChanged事件委托字段
    -- CheckBox Event Fields:
    EVENT_DROPDOWN
    EVENT_DRAWITEM
    EVENT_MEASUREITEM
    EVENT_SELECTEDINDEXCHANGED
    EVENT_SELECTIONCHANGECOMMITTED
    EVENT_SELECTEDITEMCHANGED
    EVENT_DROPDOWNSTYLE
    EVENT_TEXTUPDATE
    EVENT_DROPDOWNCLOSED
    -- Control Event Fields:
    EventAutoSizeChanged
    EventKeyDown
    EventKeyPress
    EventKeyUp
    EventMouseDown
    EventMouseEnter
    EventMouseLeave
    EventDpiChangedBeforeParent
    EventDpiChangedAfterParent
    EventMouseHover
    EventMouseMove
    EventMouseUp
    EventMouseWheel
    EventClick
    EventClientSize
    EventDoubleClick
    EventMouseClick
    EventMouseDoubleClick
    EventMouseCaptureChanged
    EventMove
    EventResize
    EventLayout
    EventGotFocus
    EventLostFocus
    EventEnabledChanged
    EventEnter
    EventLeave
    EventHandleCreated
    EventHandleDestroyed
    EventVisibleChanged
    EventControlAdded
    EventControlRemoved
    EventChangeUICues
    EventSystemColorsChanged
    EventValidating
    EventValidated
    EventStyleChanged
    EventImeModeChanged
    EventHelpRequested
    EventPaint
    EventInvalidated
    EventQueryContinueDrag
    EventGiveFeedback
    EventDragEnter
    EventDragLeave
    EventDragOver
    EventDragDrop
    EventQueryAccessibilityHelp
    EventBackgroundImage
    EventBackgroundImageLayout
    EventBindingContext
    EventBackColor
    EventParent
    EventVisible
    EventText
    EventTabStop
    EventTabIndex
    EventSize
    EventRightToLeft
    EventLocation
    EventForeColor
    EventFont
    EventEnabled
    EventDock
    EventCursor
    EventContextMenu
    EventContextMenuStrip
    EventCausesValidation
    EventRegionChanged
    EventMarginChanged
    EventPaddingChanged
    EventPreviewKeyDown

      1 /// <summary>
      2 /// 默认反射搜索方式标记
      3 /// </summary>
      4 internal const BindingFlags BindingFlagsDef =
      5     BindingFlags.Instance
      6     | BindingFlags.Static
      7     | BindingFlags.Public
      8     | BindingFlags.NonPublic
      9     | BindingFlags.GetField
     10     | BindingFlags.SetField
     11     | BindingFlags.GetProperty
     12     | BindingFlags.SetProperty
     13     ;
     14     
     15 /// <summary>
     16 /// 获取对象名称为 name 的 事件
     17 /// </summary>
     18 /// <param name="obj">对象</param>
     19 /// <param name="name">名称</param>
     20 /// <param name="bindingFlags">反射搜索方式标记</param>
     21 /// <returns></returns>
     22 public static EventInfo GetEvent(object obj, string name, BindingFlags bindingFlags = BindingFlagsDef)
     23 {
     24     Type type = GetObjType(obj);
     25     try
     26     {
     27         EventInfo Event = bindingFlags.Equals(BindingFlagsDef) ? type.GetEvent(name) : type.GetEvent(name, bindingFlags);
     28         return Event;
     29     }
     30     catch(Exception ex)
     31     {
     32         ConsDebug.WriteErrorLog(ex,$"TypeProp.GetEvent({obj},{name},{bindingFlags})");
     33         return null;
     34     }
     35 }    
     36 /// <summary>
     37 /// 获取事件的字段信息FieldInfo
     38 /// </summary>
     39 /// <param name="obj"></param>
     40 /// <param name="name"></param>
     41 /// <param name="bindingFlags"></param>
     42 /// <returns></returns>
     43 public static List<FieldInfo> GetEventFields(object obj, string name = "", BindingFlags bindingFlags = BindingFlagsDef)
     44 {
     45     List<FieldInfo> fieldInfos = new List<FieldInfo>();
     46     if (GetEvent(obj, name) is EventInfo eventInfo)
     47     {
     48         string eventName = eventInfo.Name; 
     49         List<string> fields = new List<string>();
     50         foreach (string eName in new string[] {
     51             eventName,
     52             eventName.Replace("Changed","")
     53         })
     54         {
     55             fields.AddRange(new string[] {
     56                 eName,
     57                 $"Event{eName}",
     58                 $"Event_{eName}",
     59                 $"Event_{eName}".ToUpper()
     60             });
     61         }
     62         switch (eventName) 
     63         {
     64             case "TextChanged":
     65                 fields.AddItem("EventText");
     66                 break;
     67             case "SizeChanged":
     68                 fields.AddItem("EventSize");
     69                 break;
     70         }
     71         foreach (string field in fields)
     72         {
     73             //Console.WriteLine($"GetEventField-field:{field}");
     74             foreach (Type type in GetBaseTypes(obj))            // 遍历对象类型 以及 对象父类类型
     75             {
     76                 if (type.GetField(field, bindingFlags) is FieldInfo fieldInfo)
     77                 {
     78                     //Console.WriteLine($"GetEventField-fieldInfo:{fieldInfo.Name}");
     79                     fieldInfos.AddItem(fieldInfo);
     80                 }
     81             }
     82         }
     83     }
     84     return fieldInfos;
     85 }
     86 /// <summary>
     87 /// 读取对象指定名称对应的(事件)委托字典集合
     88 /// </summary>
     89 /// <param name="obj">对象</param>
     90 /// <param name="name">名称</param>
     91 /// <param name="bindingFlags">反射搜索方式标记</param>
     92 /// <returns></returns>
     93 public static Dictionary<string, Delegate> GetEventDelegate(object obj, string name = "", BindingFlags bindingFlags = BindingFlagsDef)
     94 {
     95     if (obj is null)
     96         return null;
     97     Dictionary<string, Delegate> delegates = new Dictionary<string, Delegate>();
     98     Type type = GetObjType(obj);
     99     try
    100     {
    101         if (GetEvent(obj, name) is EventInfo eventInfo)
    102         {
    103             PropertyInfo eventPropInfo = type.GetProperty("Events", bindingFlags);          // 获取type类定义的所有事件的信息
    104             if (eventPropInfo?.GetValue(obj) is EventHandlerList eventHandlerList)          // 获取对象的事件处理程序列表
    105             {
    106                 int addCount = 0;
    107                 foreach (FieldInfo fieldInfo in GetEventFields(obj, name, bindingFlags) )   // 获取事件的字段信息
    108                 {
    109                     object fieldVal = fieldInfo.GetValue(obj);
    110                     if (fieldVal != null && eventHandlerList[fieldVal] is Delegate deleg)
    111                     {
    112                         foreach (Delegate dele in deleg.GetInvocationList())
    113                         {
    114                             delegates.AddItem(eventInfo.Name, dele, AddMode.KeyIncrement);
    115                             addCount++;
    116                         }
    117                     }
    118                 }
    119                 if(addCount == 0)
    120                 {
    121                     delegates.AddItem(eventInfo.Name, null, AddMode.KeyIncrement);
    122                 }
    123             }
    124         }
    125     }
    126     catch(Exception ex)
    127     {
    128         ConsDebug.WriteErrorLog(ex, $"TypeProp.GetEventDelegate({obj},{name},{bindingFlags})");
    129     }
    130     if (name.IsNullOrEmpty())
    131     {
    132         foreach (EventInfo eventInfo in type.GetEvents())
    133         {
    134             delegates.AddRange(GetEventDelegate(obj, eventInfo.Name));
    135         }
    136     }
    137     return delegates;
    138 }
    139 
    140 /// <summary>
    141 /// Dictionary扩展
    142 /// </summary>
    143 public static class DictionaryExtension
    144 {
    145     /// <summary>
    146     /// 集合项添加模式枚举
    147     /// </summary>
    148     [Description("集合项添加模式枚举")]
    149     [Flags]
    150     public enum AddMode
    151     {
    152         /// <summary>
    153         /// 常规
    154         /// </summary>
    155         [Description("常规")]
    156         Normal = 0,
    157         /// <summary>
    158         /// 唯一(如果键值存在,则不添加)
    159         /// </summary>
    160         [Description("唯一(如果键值存在,则不添加)")]
    161         Unique = 2,
    162         /// <summary>
    163         /// 不为空(如果键值为空,则不添加)
    164         /// </summary>
    165         [Description("不为空(如果键值为空,则不添加)")]
    166         NonNull = 4,
    167         /// <summary>
    168         /// 不为空或空字符串(如果键值为空或空字符串,则不添加)
    169         /// </summary>
    170         [Description("不为空或空字符串(如果键值为空或空字符串,则不添加)")]
    171         NonNullOrEmpty = 8,
    172         /// <summary>
    173         /// 如果键值存在,则自动添加自增索引
    174         /// </summary>
    175         [Description("如果键值存在,则自动添加自增索引")]
    176         KeyIncrement = 16
    177     }
    178     internal static string AddModeKeyIncrementDelim = "-";
    179     /// <summary>
    180     /// 扩展:Dictionary AddItem 
    181     /// </summary>
    182     /// <param name="dictTarget">目标字典</param>
    183     /// <param name="key"></param>
    184     /// <param name="val"></param>
    185     /// <param name="addMode"></param>
    186     /// <param name="mode"></param>
    187     public static void AddItem<TKey,TValue>(this Dictionary<TKey, TValue> dictTarget, TKey key, TValue val, AddMode addMode = AddMode.Unique, int mode = 0)
    188     {
    189         try
    190         {
    191             if (dictTarget is null || key.IsNullOrEmpty() || key.IsNull())
    192                 return;
    193             if (val.IsNull() && (addMode & AddMode.NonNull) is AddMode.NonNull)
    194                 return;
    195             if (val.IsNullOrEmpty(true) && (addMode & AddMode.NonNullOrEmpty) is AddMode.NonNullOrEmpty)
    196                 return;
    197             if (dictTarget.ContainsKey(key) && (addMode & AddMode.Unique) is AddMode.Unique)
    198                 return;
    199             if (key is string && (addMode & AddMode.KeyIncrement) is AddMode.KeyIncrement)
    200             {
    201                 int startsWithKey = 0;
    202                 foreach (KeyValuePair<TKey, TValue> kvp in dictTarget)
    203                     if (kvp.Key.ToString().StartsWith(key.ToString()))
    204                         startsWithKey++;
    205                 if (startsWithKey > 0)
    206                     key = $"{key}{AddModeKeyIncrementDelim}{startsWithKey}".ConvertTo<TKey>();
    207             }
    208             if (mode == 0)
    209             {
    210                 //Console.WriteLine($"AddItem{mode} = ({key},{val})");
    211             }
    212             dictTarget.Add(key, val);
    213         }
    214         catch (Exception ex)
    215         {
    216             ConsDebug.WriteErrorLog(ex,$"DictionaryExtension.AddItem<{typeof(TKey)},{typeof(TValue)}>({dictTarget},{key},{val},{addMode})");
    217         }
    218     }
    219 }
    博客标明【原创】的文章都是本人亲自编写内容! 如有需要转载, 请标明出处:辉创1989(http://www.cnblogs.com/ahui1989/),届时非常感谢! 文章分享在此,希望我之原创有帮到你们! 如有不足之处也可联系我,以便我们共同探讨! 本人现职为Epicor10 系统 开发维护工作,如有需要可共同探讨相关技术知识及经验总结! QQ:929412592
  • 相关阅读:
    深入理解Elasticsearch写入过程 使用routing会导致docid不再全局唯一 Allocate策略 + routing参数
    force merge原理 + ES写入数据的过程
    Linux内核参数--time-wait回收--不建议设置
    elasticsearch迁移--利用腾讯云cos和nfs
    蓝鲸安装失败
    Apache Tomcat/8.5.51 secretRequired="true"
    自定义Nginx返回页面
    本地yum 源 iso文件 安装ansible
    elasticsearch字段属性值截断为32位
    rabbitmq-consul-apollo部署文档
  • 原文地址:https://www.cnblogs.com/ahui1989/p/13127182.html
Copyright © 2020-2023  润新知