using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace Umbraco.Core.Events { /// /// Extension methods for cancellable event operations /// public static class EventExtensions { /// /// Raises the event and returns a boolean value indicating if the event was cancelled /// /// /// /// /// /// /// public static bool IsRaisedEventCancelled( this TypedEventHandler eventHandler, TArgs args, TSender sender) where TArgs : CancellableEventArgs { if (eventHandler != null) eventHandler(sender, args); return args.Cancel; } /// /// Raises the event /// /// /// /// /// /// public static void RaiseEvent( this TypedEventHandler eventHandler, TArgs args, TSender sender) where TArgs : EventArgs { if (eventHandler != null) eventHandler(sender, args); } // moves the last handler that was added to an instance event, to first position public static void PromoteLastHandler(object sender, string eventName) { var fieldInfo = sender.GetType().GetField(eventName, BindingFlags.Instance | BindingFlags.NonPublic); if (fieldInfo == null) throw new InvalidOperationException("No event named " + eventName + "."); PromoteLastHandler(sender, fieldInfo); } // moves the last handler that was added to a static event, to first position public static void PromoteLastHandler(string eventName) { var fieldInfo = typeof(TSender).GetField(eventName, BindingFlags.Static | BindingFlags.NonPublic); if (fieldInfo == null) throw new InvalidOperationException("No event named " + eventName + "."); PromoteLastHandler(null, fieldInfo); } private static void PromoteLastHandler(object sender, FieldInfo fieldInfo) { var d = fieldInfo.GetValue(sender) as Delegate; if (d == null) return; var l = d.GetInvocationList(); var x = l[l.Length - 1]; for (var i = l.Length - 1; i > 0; i--) l[i] = l[i - 1]; l[0] = x; fieldInfo.SetValue(sender, Delegate.Combine(l)); } } }