我有一个第三方编辑器,它基本上包括一个文本框和一个按钮(DevExpress ButtonEdit控件)。我想进行特定的击键(Alt+ Down)模拟单击按钮。为了避免重复编写此内容,我想制作一个通用的KeyUp事件处理程序,该处理程序将引发ButtonClick事件。不幸的是,控件中似乎没有引发ButtonClick事件的方法,所以…
Alt
Down
如何通过反射从外部函数引发事件?
这是一个使用泛型的演示(省略了错误检查):
using System; using System.Reflection; static class Program { private class Sub { public event EventHandler<EventArgs> SomethingHappening; } internal static void Raise<TEventArgs>(this object source, string eventName, TEventArgs eventArgs) where TEventArgs : EventArgs { var eventDelegate = (MulticastDelegate)source.GetType().GetField(eventName, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(source); if (eventDelegate != null) { foreach (var handler in eventDelegate.GetInvocationList()) { handler.Method.Invoke(handler.Target, new object[] { source, eventArgs }); } } } public static void Main() { var p = new Sub(); p.Raise("SomethingHappening", EventArgs.Empty); p.SomethingHappening += (o, e) => Console.WriteLine("Foo!"); p.Raise("SomethingHappening", EventArgs.Empty); p.SomethingHappening += (o, e) => Console.WriteLine("Bar!"); p.Raise("SomethingHappening", EventArgs.Empty); Console.ReadLine(); } }