[C#应用]得到组件事件的委托列表
来源:互联网 发布:全国商务网络创新大赛 编辑:程序博客网 时间:2024/04/29 21:13
...{
Type componentType = component.GetType();
PropertyInfo eventsPropertyInfo = componentType.GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList eventHanlderList = eventsPropertyInfo.GetValue(component, null) as EventHandlerList;
FieldInfo HeadFieldInfo = eventHanlderList.GetType().GetField("head", BindingFlags.Instance | BindingFlags.NonPublic);
object HeadObject = HeadFieldInfo.GetValue(eventHanlderList);
do
...{
FieldInfo[] fieldInfoList = componentType.GetFields(BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
foreach (FieldInfo fieldInfo in fieldInfoList)
...{
object fieldValue = fieldInfo.GetValue(component);
if (fieldValue != null)
...{
Type fieldType = fieldValue.GetType();
if (fieldType.Name == EventHandlerTypeName && (fieldValue as Delegate) != null)
...{
return (fieldValue as Delegate).GetInvocationList();
}
else if (fieldType.Name == typeof(Object).Name)
...{
if (fieldInfo.Name.IndexOf(EventName, StringComparison.OrdinalIgnoreCase) > -1)
...{
if (HeadObject != null)
...{
Delegate delegateObject = eventHanlderList[fieldValue];
if (delegateObject != null)
return delegateObject.GetInvocationList();
}
}
}
}
}
componentType = componentType.BaseType;
} while (componentType != null);
if (HeadObject != null)
...{
object ListEntry = HeadObject;
Type ListEntryType = ListEntry.GetType();
FieldInfo handlerFieldInfo = ListEntryType.GetField("handler", BindingFlags.Instance | BindingFlags.NonPublic);
FieldInfo keyFieldInfo = ListEntryType.GetField("key", BindingFlags.Instance | BindingFlags.NonPublic);
FieldInfo nextFieldInfo = ListEntryType.GetField("next", BindingFlags.Instance | BindingFlags.NonPublic);
while (ListEntry != null)
...{
Delegate handler = handlerFieldInfo.GetValue(ListEntry) as Delegate;
object key = keyFieldInfo.GetValue(ListEntry);
ListEntry = nextFieldInfo.GetValue(ListEntry);
if (handler != null && handler.GetType().Name == EventHandlerTypeName)
return handler.GetInvocationList();
}
}
return null;
}
简要说明:
1)参数说明:
component: 组件对象实例
EventName: 事件的名称,如"ItemClick"
EventHandlerTypeName: 事件委托类型,如"ItemClickEventHander"
2)代码说明:
第一段代码遍历组件的所有私有字段,尝试根据EventName和EventHandlerTypeName找出相关的字段.
如果找到了相关的字段,检查它的值是否是Delegate类型,是的话OK.如果它的值是Object类型,那么说明它是EventHandlerList的key,则需要用EventHandlerList实例[key]来得到委托列表.
第二段代码在第一段代码没找到对应的字段的情况下,检查EventHandlerList是否为空,不为空的话。遍历该组件的所有事件,尝试使用EventHandlerTypeName来找到相关的委托列表。
如果还未找到,则返回null。
3)存在的问题
可能无法找到某些组件的委托,或者找到不匹配的委托列表。
能否顺利地找到事件对应的委托列表,取决于组件内部定义的事件字段或在EventHandlerList的key字段是否与事件名称相同以及EventHandler类型是否特殊。
如果组件内部定义了与事件名称相同的字段或EventHandler类型比较特别,则较容易找到对应的委托列表。
虽然可以通过EventHandlerList来得到组件的所有事件委托,但根据得到的key却无法确定handler委托列表对应的是哪一个事件。
4)已检测过的组件和事件
没来得及仔细测试,只测试了二个XtraBar的BarButtonItem.ItemClick和XtraNavBar的NavBarItem.LinkClicked事件。
- [C#应用]得到组件事件的委托列表
- [C#应用]得到组件事件的委托列表
- C# 委托事件的应用
- c# 委托和事件的应用
- c#委托与事件的应用
- C#中的组件-事件-委托
- C#中的组件-事件-委托
- 对c#委托及事件委托的理解_c#应用
- C#委托事件应用实例
- c# 委托的应用
- c# 委托的应用
- C#委托的应用
- C# 委托与事件简单应用
- c#的委托与事件
- C#的委托与事件
- c#的委托和事件
- c#的委托和事件
- c#的委托和事件
- 信息隐藏与数字水印技术
- 管理软件新走向:从商业智能扩展至管理智能
- 不同种类的webservice错误信息
- 配置JRE和Mozilla之间的关联
- 使用vb.net代码实现图像水印技术
- [C#应用]得到组件事件的委托列表
- 计算机视觉类库OpenCV简介
- 个人卡通自画像软件
- 平台无关性/相关性理解
- MP3音乐水印技术现身 网络音乐盗版将受限
- 配置文件多个一个">"符号,导致struts抛出了匪夷所思的错误
- java多线程学习笔记2
- Windows2000 server + Microsoft Visual Studio 6.0 + Qt-commercial4.22-src编译过程
- hibernate的lazy配置引起的问题