C# 用反射动态绑定事件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Reflection;
using System.Diagnostics; namespace WebApplication5
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
EventHandler clickHandler = delegate(object s, EventArgs x) {
var ctrl = s as WebControl;
Debug.Print(ctrl.ID);
}; var click = Button1.GetType().GetEvents().FirstOrDefault(ei => ei.Name.ToLower() == "click");
var handler = Delegate.CreateDelegate(clickHandler.GetType(), clickHandler.Method);
click.AddEventHandler(Button1, handler);
}
}
}
使用预定义委托:
public void registerUserActionLog(Control ctrl)
{
var click = ctrl.GetType().GetEvents().FirstOrDefault(ei => ei.Name.ToLower() == "click");
if (click != null)
{
var method = this.GetType().GetMethod("ctrl_Click");
var handler = Delegate.CreateDelegate(click.EventHandlerType, this, method);
click.AddEventHandler(ctrl, handler);
} foreach (Control c in ctrl.Controls)
{
registerUserActionLog(c);
}
} public void ctrl_Click(object sender, EventArgs e)
{
var ctrl = sender as WebControl;
OMSLogManager.UserActionLogger.log(this.GetType().Name + "\t" + ctrl.ID + ".Click");
}
动态调整事件处理程序的调用顺序:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var method = this.GetType().GetMethod("ctrl_Click");
var click = Button1.GetType().GetEvents().FirstOrDefault(ei => ei.Name.ToLower() == "click");
var handler = Delegate.CreateDelegate(click.EventHandlerType, null, method);
var handlerList = new List<Delegate>(); PropertyInfo propertyInfo = Button1.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
EventHandlerList eventHandlerList = propertyInfo.GetValue(Button1, new object[] { }) as EventHandlerList;
FieldInfo fieldInfo = typeof(Button).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static);
if(fieldInfo == null)
fieldInfo = typeof(Button).GetField("Click", BindingFlags.NonPublic | BindingFlags.Static);
if (fieldInfo != null)
{
object eventKey = fieldInfo.GetValue(Button1);
var del = eventHandlerList[eventKey] as Delegate;
foreach (var h in del.GetInvocationList())
{
//preserve previous eventhandler
handlerList.Add(h); //remove previous eventhandler
click.RemoveEventHandler(Button1, h);
}
} //add new eventhandler
click.AddEventHandler(Button1, handler); //add previous eventhandler
foreach (var h in handlerList)
{
click.AddEventHandler(Button1, h);
}
} public void ctrl_Click(object sender, EventArgs e)
{ } protected void Button1_Click(object sender, EventArgs e)
{ }
}
C# 用反射动态绑定事件的更多相关文章
- jquery json遍历和动态绑定事件
<div id='tmpselectorList' style='border: 1px solid grey;max-height: 150px;position:absolute;text- ...
- jQuery的动态绑定事件的应用
注意:bind()的事件绑定是只对当前页面选中的元素有效.如果你想对动态创建的元素bind()事件,是没有办法达到效果的 <script src="jquery-1.11.2.min. ...
- 利用反射绑定事件处理程序(C#)
利用反射绑定事件处理程序(C#) 传统的写法:强类型的情况下 using System;using System.Collections.Generic;using System.Text; usin ...
- .NET/C# 使用反射注册事件
使用反射,我们可以很容易地在运行时调用一些编译时无法确定的属性.方法等.那么如何注册事件呢? 本文将介绍如何使用反射注册事件. 本文内容 不使用反射 使用反射 安全地使用反射 参考资料 不使用反射 例 ...
- 动态绑定事件-on
动态绑定事件 $(document).on("各种事件(如click.mousemove...)","事件对象(比如我点击class为.close的div,那么这里就是. ...
- jquery - 动态绑定事件
举个例子: html页面 <div><button type="button" class="test">测试</button&g ...
- Delphi中匿名方法动态绑定事件
应恢弘之约,写了一个对其发布的匿名函数动态绑定到事件的封装,代码如下: type TAnonEvent=class public class function Wrap<T1,T2>(On ...
- 通过反射绑定事件_Office Visio
花了好几个小时才Try出来,记录一下: //反射获取Visio.Application,此处没有判断是否有安装Visio mVisioType = System.Type.Get ...
- 【JQ】jq动态绑定事件.on()、解绑事件off()
#JQ 绑定与解绑事件的方法的历史演变 1. jquery1.4 及之前的版本,由.click() 或 .bind()方法绑定的事件,不能适用脚本创建的新元素:即是说页面加载完成后,再动态创建的DOM ...
随机推荐
- fzu1977
题解: 和前两题差不多 只不过变成了有些一定走,有些不一定 代码: #include<cstdio> #include<cmath> #include<algorithm ...
- 使用markdown第一个博客
markdown,I coming ! System.out.println("I m coming");
- TNetHTTPClient 使用
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...
- 《Python》网络编程之客户端/服务端框架、套接字(socket)初使用
一.软件开发的机构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:QQ.微信.网盘等这一类是属于需要安装的桌面应用 第二种是web类:比如百度.知乎.博客园等使用浏览器访问 ...
- java动手动脑2
仔细阅读示例: EnumTest.java,运行它,分析运行结果? 你能得到什么结论?你掌握了枚举类型的基本用法了吗? 运行结果: 第一个false是判断s和t是否引用同一个对象,第二个false是判 ...
- div 自适应高度
自适应高度 ,设置最小高度:通常情况下,没有设置高度,div默认自适应高度且无最低高度 1 div{ _height:200px; /* css 注解: 仅IE6设别此属性,假定最低高度是200px ...
- JavaWeb基础-认识JavaWeb
程序开发体系 B/S 浏览器/服务器 开发维护成本低 客户端负载低 安全性低 C/S 客户端/服务器 成本高 客户端负载高 安全性高 javaweb简介 静态网页 HTML CSS,人浏览的数据是始终 ...
- 解决jsp表达式不能解析的问题
在jsp页面用了表达式,但是出现了表达式不能解析的问题 出现的页面如下 原因:web.xml的版本过低,maven自动生成的web.xml版本为2.3,只有2.3以上的版本才支持表达式 解决方法:改w ...
- ubantu 安装git
1.安装git并配置 sudo add-apt-repository ppa:git-core/ppa sudo apt-get update sudo apt-get install git 可以使 ...
- ORACLE提示表名无效
在创建ORACLE数据库时,创建表 提示表名无效 请查看数据库表名是否出现了小写字母或者关键字,如USER