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 ...
随机推荐
- Java 算法 概念汇总
编程面试的10大算法概念汇总 以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java ...
- JQuery button控制div或者section
一.项目你需求 点击左边导航栏的某个按钮,右边内容栏显示出,相应的内容 效果如图 二.html与css.jQuery 1.div模式 <!DOCTYPE html PUBLIC " ...
- day039 数据库索引
今日内容: 1.为什么要有索引 简而言之,索引出现的意义是为了更方便,更快速的查询数据. 什么是索引 索引在mysql中也叫''键''或'key'(primary key unique key,ind ...
- tomcat原理详解
tomcat的启动是通过Bootstrap类的main方法(tomcat6开始也可以直接通过Catlina的main启动) Bootstrap的启动 Bootstrap的main方法先new了一个自己 ...
- 通过eclipse创建项目
基于eclipse的Java文件:项目(project)<类(class)<方法(method),即方法method必须基于class, class必须基于project. 项目是程序的源 ...
- Linux 最小安装常用包
Linux最小安装后很多常用的工具都没有,但直接通过yum install 文件名的方式可能无法找到,汇总于此,随时更新: CentOS7 1.如果要通过SecureCRT上直接上传下载文件,最简单的 ...
- Cracking The Coding Interview3.3
//Imagine a (literal) stack of plates. If the stack gets too high, it might topple. Therefore, in re ...
- intelij idea常用设置
1.genneral设置 2.自动导包 3.设置显示行号和方法分隔符 4.忽略大小写提示代码 比如:输入str会让其提示String 5.去掉单行显示类,让idea多行显示,容易找到类 6.设置字体及 ...
- 一个在linxu自动切换ip的脚本
最近的爬虫是在linux下运行的,使用的是云立方的代理服务器,需要自动切换一下ip. #!/bin/bash# coding:utf8 aa="sources.list" #主流程 ...
- 201621123001《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键字:继承,多态,覆盖(Override),重载(Overload),抽象类(abstract)等. 1.2 尝试使用思维导图 ...