[COLOR=#0000FF]using[/color] System;
[COLOR=#0000FF]using[/color] System.Collections.Generic;
[COLOR=#0000FF]using[/color] System.ComponentModel;
[COLOR=#0000FF]using[/color] System.Linq;
[COLOR=#0000FF]using[/color] System.Reflection;
[COLOR=#0000FF]namespace[/color] CustomLibraries
{
[COLOR=#0000FF]class[/color] [COLOR=#2B91AF]EventHelper[/color]
{
[COLOR=#0000FF]static[/color] [COLOR=#2B91AF]List[/color]<[COLOR=#2B91AF]RemovedEvents[/color]> removedEvents = [COLOR=#0000FF]new[/color] [COLOR=#2B91AF]List[/color]<[COLOR=#2B91AF]RemovedEvents[/color]>();
[COLOR=#0000FF]static[/color] [COLOR=#2B91AF]BindingFlags[/color] AllFlags = [COLOR=#2B91AF]BindingFlags[/color].IgnoreCase | [COLOR=#2B91AF]BindingFlags[/color].Public | [COLOR=#2B91AF]BindingFlags[/color].Instance | [COLOR=#2B91AF]BindingFlags[/color].Static | [COLOR=#2B91AF]BindingFlags[/color].NonPublic;
[COLOR=#0000FF]private[/color] [COLOR=#0000FF]static[/color] [COLOR=#2B91AF]List[/color]<[COLOR=#2B91AF]EventFound[/color]> GetEventFields([COLOR=#2B91AF]Type[/color] t)
{
[COLOR=#2B91AF]List[/color]<[COLOR=#2B91AF]EventFound[/color]> fields = [COLOR=#0000FF]new[/color] [COLOR=#2B91AF]List[/color]<[COLOR=#2B91AF]EventFound[/color]>();
[COLOR=#2B91AF]EventInfo[/color][] eventInfos = t.GetEvents();
[COLOR=#0000FF]foreach[/color] ([COLOR=#2B91AF]EventInfo[/color] eventInfo [COLOR=#0000FF]in[/color] eventInfos)
{
[COLOR=#2B91AF]Type[/color] declaringType = eventInfo.DeclaringType;
[COLOR=#2B91AF]FieldInfo[/color] fieldInfo = declaringType.GetField(eventInfo.Name, AllFlags);
[COLOR=#0000FF]if[/color] (fieldInfo == [COLOR=#0000FF]null[/color])
fieldInfo = declaringType.GetField([COLOR=#A31515]"Event"[/color] + eventInfo.Name, AllFlags);
[COLOR=#0000FF]if[/color] (fieldInfo != [COLOR=#0000FF]null[/color])
fields.Add([COLOR=#0000FF]new[/color] [COLOR=#2B91AF]EventFound[/color]() { FieldInfo = fieldInfo, EventInfo = eventInfo });
}
[COLOR=#0000FF]return[/color] fields;
}
[COLOR=#0000FF]public[/color] [COLOR=#0000FF]static[/color] [COLOR=#0000FF]void[/color] ToggleAllEvents([COLOR=#0000FF]object[/color] obj)
{
[COLOR=#0000FF]if[/color] (removedEvents.Where(r => r.Object == obj).Count() > 0)
RehookAllEvent(obj);
[COLOR=#0000FF]else[/color]
RemoveAllEvents(obj, [COLOR=#0000FF]true[/color]);
}
[COLOR=#0000FF]public[/color] [COLOR=#0000FF]static[/color] [COLOR=#0000FF]bool[/color] RehookAllEvent([COLOR=#0000FF]object[/color] obj)
{
[COLOR=#0000FF]var[/color] item = removedEvents.Where(r => r.Object == obj);
[COLOR=#0000FF]if[/color] (item.Count() == 0)
[COLOR=#0000FF]return[/color] [COLOR=#0000FF]false[/color];
[COLOR=#0000FF]foreach[/color] ([COLOR=#2B91AF]RemovedEvent[/color] ev [COLOR=#0000FF]in[/color] item.First().Events)
[COLOR=#0000FF]if[/color] (ev.Method != [COLOR=#0000FF]null[/color] && ev.EventInfo != [COLOR=#0000FF]null[/color])
ev.EventInfo.AddEventHandler(obj, ev.Method);
removedEvents.Remove(item.First());
[COLOR=#0000FF]return[/color] [COLOR=#0000FF]true[/color];
}
[COLOR=#0000FF]public[/color] [COLOR=#0000FF]static[/color] [COLOR=#0000FF]void[/color] RemoveAllEvents([COLOR=#0000FF]object[/color] obj, [COLOR=#0000FF]bool[/color] storeEvents)
{
[COLOR=#2B91AF]Type[/color] t = obj.GetType();
[COLOR=#2B91AF]List[/color]<[COLOR=#2B91AF]EventFound[/color]> eventFields = GetEventFields(t);
[COLOR=#0000FF]foreach[/color] ([COLOR=#2B91AF]EventFound[/color] eventField [COLOR=#0000FF]in[/color] eventFields)
{
[COLOR=#2B91AF]Delegate[/color] eventDelegate = [COLOR=#0000FF]null[/color];
[COLOR=#0000FF]if[/color] (!eventField.FieldInfo.IsStatic)
eventDelegate = eventField.FieldInfo.GetValue(obj) [COLOR=#0000FF]as[/color] [COLOR=#2B91AF]Delegate[/color];
[COLOR=#0000FF]else[/color]
{
[COLOR=#2B91AF]MethodInfo[/color] methodInfo = t.GetMethod([COLOR=#A31515]"get_Events"[/color], AllFlags);
[COLOR=#2B91AF]EventHandlerList[/color] eventList = methodInfo.Invoke(obj, [COLOR=#0000FF]new[/color] [COLOR=#0000FF]object[/color][] { }) [COLOR=#0000FF]as[/color] [COLOR=#2B91AF]EventHandlerList[/color];
[COLOR=#0000FF]if[/color] (eventList == [COLOR=#0000FF]null[/color])
[COLOR=#0000FF]continue[/color];
[COLOR=#0000FF]object[/color] staticField = eventField.FieldInfo.GetValue(obj);
eventDelegate = eventList[staticField];
}
[COLOR=#0000FF]if[/color] (eventDelegate == [COLOR=#0000FF]null[/color])
[COLOR=#0000FF]continue[/color];
[COLOR=#2B91AF]RemovedEvents[/color] res = [COLOR=#0000FF]null[/color];
[COLOR=#0000FF]if[/color] (storeEvents)
res = [COLOR=#0000FF]new[/color] [COLOR=#2B91AF]RemovedEvents[/color](obj);
[COLOR=#0000FF]foreach[/color] ([COLOR=#2B91AF]Delegate[/color] method [COLOR=#0000FF]in[/color] eventDelegate.GetInvocationList())
{
[COLOR=#0000FF]if[/color] (storeEvents)
{
[COLOR=#2B91AF]RemovedEvent[/color] re = [COLOR=#0000FF]new[/color] [COLOR=#2B91AF]RemovedEvent[/color](eventField.EventInfo, method, obj);
res.AddEvent(re);
}
eventField.EventInfo.RemoveEventHandler(obj, method);
}
[COLOR=#0000FF]if[/color] (storeEvents)
removedEvents.Add(res);
}
}
[COLOR=#0000FF]class[/color] [COLOR=#2B91AF]RemovedEvents[/color]
{
[COLOR=#0000FF]private[/color] [COLOR=#2B91AF]List[/color]<[COLOR=#2B91AF]RemovedEvent[/color]> _RemovedEvents;
[COLOR=#0000FF]private[/color] [COLOR=#2B91AF]WeakReference[/color] _Object;
[COLOR=#0000FF]public[/color] [COLOR=#0000FF]object[/color] Object { [COLOR=#0000FF]get[/color] { [COLOR=#0000FF]return[/color] _Object.Target; } }
[COLOR=#0000FF]public[/color] [COLOR=#2B91AF]List[/color]<[COLOR=#2B91AF]RemovedEvent[/color]> Events { [COLOR=#0000FF]get[/color] { [COLOR=#0000FF]return[/color] _RemovedEvents; } }
[COLOR=#0000FF]public[/color] RemovedEvents([COLOR=#0000FF]object[/color] obj)
{
_Object = [COLOR=#0000FF]new[/color] [COLOR=#2B91AF]WeakReference[/color](obj, [COLOR=#0000FF]false[/color]);
_RemovedEvents = [COLOR=#0000FF]new[/color] [COLOR=#2B91AF]List[/color]<[COLOR=#2B91AF]RemovedEvent[/color]>();
}
[COLOR=#0000FF]public[/color] [COLOR=#0000FF]void[/color] AddEvent([COLOR=#2B91AF]RemovedEvent[/color] re)
{
_RemovedEvents.Add(re);
}
}
[COLOR=#0000FF]class[/color] [COLOR=#2B91AF]RemovedEvent[/color]
{
[COLOR=#0000FF]public[/color] [COLOR=#2B91AF]EventInfo[/color] EventInfo { [COLOR=#0000FF]get[/color] { [COLOR=#0000FF]return[/color] _EventInfo.Target [COLOR=#0000FF]as[/color] [COLOR=#2B91AF]EventInfo[/color]; } }
[COLOR=#0000FF]public[/color] [COLOR=#2B91AF]Delegate[/color] Method { [COLOR=#0000FF]get[/color] { [COLOR=#0000FF]return[/color] _Method.Target [COLOR=#0000FF]as[/color] [COLOR=#2B91AF]Delegate[/color]; } }
[COLOR=#0000FF]public[/color] [COLOR=#0000FF]object[/color] Object { [COLOR=#0000FF]get[/color] { [COLOR=#0000FF]return[/color] _Object.Target; } }
[COLOR=#0000FF]private[/color] [COLOR=#2B91AF]WeakReference[/color] _EventInfo;
[COLOR=#0000FF]private[/color] [COLOR=#2B91AF]WeakReference[/color] _Method;
[COLOR=#0000FF]private[/color] [COLOR=#2B91AF]WeakReference[/color] _Object;
[COLOR=#0000FF]public[/color] RemovedEvent([COLOR=#2B91AF]EventInfo[/color] ev, [COLOR=#2B91AF]Delegate[/color] m, [COLOR=#0000FF]object[/color] target)
{
_EventInfo = [COLOR=#0000FF]new[/color] [COLOR=#2B91AF]WeakReference[/color](ev, [COLOR=#0000FF]false[/color]);
_Method = [COLOR=#0000FF]new[/color] [COLOR=#2B91AF]WeakReference[/color](m, [COLOR=#0000FF]false[/color]);
_Object = [COLOR=#0000FF]new[/color] [COLOR=#2B91AF]WeakReference[/color](target, [COLOR=#0000FF]false[/color]);
}
}
[COLOR=#0000FF]class[/color] [COLOR=#2B91AF]EventFound[/color]
{
[COLOR=#0000FF]public[/color] [COLOR=#2B91AF]EventInfo[/color] EventInfo { [COLOR=#0000FF]get[/color]; [COLOR=#0000FF]set[/color]; }
[COLOR=#0000FF]public[/color] [COLOR=#2B91AF]FieldInfo[/color] FieldInfo { [COLOR=#0000FF]get[/color]; [COLOR=#0000FF]set[/color]; }
}
}
}