using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using FWindSoft.SystemExtensions; namespace Test.EventTest { /// /// WinEventTest.xaml 的交互逻辑 /// public partial class WinEventTest : Window { private object m_RefObject; public WinEventTest() { InitializeComponent(); this.Loaded += WinEventTest_Loaded; //this.Loaded -= new RoutedEventHandler(WinEventTest_Loaded); } private void WinEventTest_Loaded(object sender, RoutedEventArgs e) { EventTest test = new EventTest(); m_RefObject=EventTest.Handler(test); this.ShellHandler += (sen, args) => { MessageBox.Show("shell"); }; test.RaiseEvent(); } public event EventHandler ShellHandler { add { var envent = m_RefObject.GetType().GetEvent("EventHandler"); envent.AddEventHandler(m_RefObject, value); } remove { var envent = m_RefObject.GetType().GetEvent("EventHandler"); envent.RemoveEventHandler(m_RefObject, value); } } } public class EventTest { public event EventHandler TestEvent; public static object Handler(EventTest ev) { var events = ev.GetType().GetEvents(BindingFlags.Public | BindingFlags.Instance); foreach (var eventInfo in events) { var type = eventInfo.EventHandlerType; MethodInfo methodInfo = type.GetMethod("Invoke"); var parameters = methodInfo.GetParameters(); if (!(parameters.Length == 2 && parameters[1].ParameterType.IsBaseType(typeof(EventArgs)))) { continue; } //var handlerMethod = typeof(BindingTest).GetMethod("Handler"); #region 测试1 //直接使用出异常 // eventInfo.AddEventHandler(ev, new EventHandler((s,e) => { MessageBox.Show("revit"); })); #endregion #region 测试二 //委托必须是同类型才能完成合并 //var deleg=Delegate.Combine(new EventHandler((s, e) => { MessageBox.Show("revit"); }), // new EventHandler((s, e) => { MessageBox.Show("revit"); })); //eventInfo.AddEventHandler(ev, deleg); #endregion #region 测试三 //当被绑定的方法签名中,输入参数是EventType中的父类时方可绑定; //输入父类到子类的透明赋值,属于逆变范畴 //var de = Delegate.CreateDelegate(type, new BindingTest(), handlerMethod); //eventInfo.AddEventHandler(ev, de); #endregion #region 测试四,泛型可以绑定 var bindingType = typeof(BindingTest<>).MakeGenericType(parameters[1].ParameterType); var handlerMethod = bindingType.GetMethod("Handler"); var instance = Activator.CreateInstance(bindingType); var de = Delegate.CreateDelegate(type, instance, handlerMethod); eventInfo.AddEventHandler(ev, de); return instance; #endregion } return null; } public void RaiseEvent() { TestEvent?.Invoke(this, null); } } public class BindingTest { public void Handler(object sender,EventArgs args) { MessageBox.Show("BindingTest"); } } public class BindingTest where T : EventArgs { public event EventHandler EventHandler; public void Handler(object sender, T args) { MessageBox.Show("BindingTestT"); EventHandler?.Invoke(sender, args); } } }