如何得到组件事件的委托列表

如何得到组件事件的委托列表

如何得到组件事件的委托列表publicstaticDelegate[]GetComponentEventDelegate(Componentcomponent,stringEventName,stringEventHandlerTypeName)
如何得到组件事件的委托列表如何得到组件事件的委托列表
{
如何得到组件事件的委托列表TypecomponentType
=component.GetType();
如何得到组件事件的委托列表PropertyInfoeventsPropertyInfo
=componentType.GetProperty("Events",BindingFlags.Instance|BindingFlags.NonPublic);
如何得到组件事件的委托列表EventHandlerListeventHanlderList
=eventsPropertyInfo.GetValue(component,null)asEventHandlerList;
如何得到组件事件的委托列表FieldInfoHeadFieldInfo
=eventHanlderList.GetType().GetField("head",BindingFlags.Instance|BindingFlags.NonPublic);
如何得到组件事件的委托列表
objectHeadObject=HeadFieldInfo.GetValue(eventHanlderList);
如何得到组件事件的委托列表
如何得到组件事件的委托列表
do
如何得到组件事件的委托列表如何得到组件事件的委托列表{
如何得到组件事件的委托列表FieldInfo[]fieldInfoList
=componentType.GetFields(BindingFlags.Static|BindingFlags.Instance|BindingFlags.NonPublic);
如何得到组件事件的委托列表
foreach(FieldInfofieldInfoinfieldInfoList)
如何得到组件事件的委托列表如何得到组件事件的委托列表
{
如何得到组件事件的委托列表
objectfieldValue=fieldInfo.GetValue(component);
如何得到组件事件的委托列表
if(fieldValue!=null)
如何得到组件事件的委托列表如何得到组件事件的委托列表
{
如何得到组件事件的委托列表TypefieldType
=fieldValue.GetType();
如何得到组件事件的委托列表
if(fieldType.Name==EventHandlerTypeName&&(fieldValueasDelegate)!=null)
如何得到组件事件的委托列表如何得到组件事件的委托列表
{
如何得到组件事件的委托列表
return(fieldValueasDelegate).GetInvocationList();
如何得到组件事件的委托列表}

如何得到组件事件的委托列表elseif(fieldType.Name==typeof(Object).Name)
如何得到组件事件的委托列表如何得到组件事件的委托列表
{
如何得到组件事件的委托列表
if(fieldInfo.Name.IndexOf(EventName,StringComparison.OrdinalIgnoreCase)>-1)
如何得到组件事件的委托列表如何得到组件事件的委托列表
{
如何得到组件事件的委托列表
if(HeadObject!=null)
如何得到组件事件的委托列表如何得到组件事件的委托列表
{
如何得到组件事件的委托列表DelegatedelegateObject
=eventHanlderList[fieldValue];
如何得到组件事件的委托列表
if(delegateObject!=null)
如何得到组件事件的委托列表
returndelegateObject.GetInvocationList();
如何得到组件事件的委托列表}

如何得到组件事件的委托列表}

如何得到组件事件的委托列表}

如何得到组件事件的委托列表}

如何得到组件事件的委托列表}

如何得到组件事件的委托列表componentType=componentType.BaseType;
如何得到组件事件的委托列表}
while(componentType!=null);
如何得到组件事件的委托列表
如何得到组件事件的委托列表
if(HeadObject!=null)
如何得到组件事件的委托列表如何得到组件事件的委托列表
{
如何得到组件事件的委托列表
objectListEntry=HeadObject;
如何得到组件事件的委托列表TypeListEntryType
=ListEntry.GetType();
如何得到组件事件的委托列表FieldInfohandlerFieldInfo
=ListEntryType.GetField("handler",BindingFlags.Instance|BindingFlags.NonPublic);
如何得到组件事件的委托列表FieldInfokeyFieldInfo
=ListEntryType.GetField("key",BindingFlags.Instance|BindingFlags.NonPublic);
如何得到组件事件的委托列表FieldInfonextFieldInfo
=ListEntryType.GetField("next",BindingFlags.Instance|BindingFlags.NonPublic);
如何得到组件事件的委托列表
如何得到组件事件的委托列表
while(ListEntry!=null)
如何得到组件事件的委托列表如何得到组件事件的委托列表
{
如何得到组件事件的委托列表Delegatehandler
=handlerFieldInfo.GetValue(ListEntry)asDelegate;
如何得到组件事件的委托列表
objectkey=keyFieldInfo.GetValue(ListEntry);
如何得到组件事件的委托列表ListEntry
=nextFieldInfo.GetValue(ListEntry);
如何得到组件事件的委托列表
如何得到组件事件的委托列表
if(handler!=null&&handler.GetType().Name==EventHandlerTypeName)
如何得到组件事件的委托列表
returnhandler.GetInvocationList();
如何得到组件事件的委托列表}

如何得到组件事件的委托列表}

如何得到组件事件的委托列表returnnull;
如何得到组件事件的委托列表}

如何得到组件事件的委托列表

简要说明:
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事件。