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);
}
}
}