我们可以通过复制事件reflection
。现在我自己会对此保持警惕,所以请彻底测试所有版本(2.0、3.0、4.0)。我尝试了很多方法,但以下是唯一的方法,我让它工作。在 .NET 4.0 上运行了冒烟测试。
在表单类上创建扩展方法
public static class FormExtension
{
public static void CopyEvent(this Form form, Control src, string fieldName, string eventName, Control dest)
{
EventHandlerList events = (EventHandlerList)typeof(Control)
.GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(src, null);
object key = typeof(Control).GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
EventInfo evInfo = typeof(Control).GetEvent(eventName, BindingFlags.Public | BindingFlags.Instance);
Delegate del = events[key];
if (del != null)
{
Delegate d = Delegate.CreateDelegate(evInfo.EventHandlerType, form, del.Method);
MethodInfo addHandler = evInfo.GetAddMethod();
Object[] addHandlerArgs = { d };
addHandler.Invoke(dest, addHandlerArgs);
}
}
}
现在像这样使用它
这里我展示了一个复制click
和text changed
事件的例子。
this.CopyEvent(richTextBox1, "EventText", "TextChanged", richTextBox2);
this.CopyEvent(richTextBox1, "EventClick", "Click", richTextBox2);
如何将其用于其他活动
您必须Control
通过 Reflector 打开课程并获取field
和eventnames
.
所以在这种情况下Text Changed
是这样的:
public event EventHandler TextChanged <-----The Event name for the "CopyEvent" function
{
add
{
base.Events.AddHandler(EventText, value);
}
remove
{
base.Events.RemoveHandler(EventText, value);
}
}
EventText
在哪里
private static readonly object EventText = new object(); <-------The Field name