public static void Raise(this object source, string eventName, params object[] args) { var eventDelegate = new Traverse(source).Field(eventName).GetValue <MulticastDelegate>(); if (eventDelegate != null) { var param = new object[args.Length + 1]; param[0] = source; for (int i = 0; i < args.Length; i++) { param[i + 1] = args[i]; } foreach (var handler in eventDelegate.GetInvocationList()) { handler.Method.Invoke(handler.Target, param); } } }