123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- 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
- {
- /// <summary>
- /// WinEventTest.xaml 的交互逻辑
- /// </summary>
- 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<DragEventArgs> 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<DragEventArgs> 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<DragEventArgs>((s,e) => { MessageBox.Show("revit"); }));
- #endregion
- #region 测试二
- //委托必须是同类型才能完成合并
- //var deleg=Delegate.Combine(new EventHandler<DragEventArgs>((s, e) => { MessageBox.Show("revit"); }),
- // new EventHandler<EventArgs>((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<T> where T : EventArgs
- {
- public event EventHandler<T> EventHandler;
- public void Handler(object sender, T args)
- {
- MessageBox.Show("BindingTestT");
- EventHandler?.Invoke(sender, args);
- }
- }
- }
|