举报投诉联系我们 手机版 热门标签 编程学
您的位置:编程学 > c#动态绑定事件 C# 动态绑定

c#动态绑定事件 C# 动态绑定

2023-02-28 19:18 C#教程

c#动态绑定事件 C# 动态绑定

c#动态绑定事件

C#动态绑定事件是指在运行时动态绑定事件,而不是在编译时静态绑定。C#动态绑定事件可以让我们在运行时更改事件处理函数,而不必重新编译代码。

C#动态绑定事件的基本原理是使用反射机制来获取对象的方法,然后将方法与特定的事件关联起来。使用反射机制查找对象的方法,然后将方法与特定的事件关联起来。

要使用C#动态绑定事件,首先要创建一个委托(delegate),该委托描述要处理的特定事件所需的方法的参数和返回值。然后使用反射机制查找对象中包含此委托声明的方法(MethodInfo对象)。最后将MethodInfo对象传递给EventHandler.AddHandler()方法来将该方法与特定的事件关联。

// 实例化一个Button 
Button btn = new Button(); 
// 实例化一个委托 
EventHandler handler = new EventHandler(MyEventHandler); 
// 获取Button中包含此委托声明的方法 
MethodInfo mi = btn.GetType().GetMethod("add_Click", new Type[] { typeof(EventHandler) }); 
// 将MyEventHandler 方法与Click 事件关联 
mi.Invoke(btn, new object[] { handler });

C# 动态绑定

C# 动态绑定

动态绑定会将类型,成员和操作的解析过程从编译时延迟到运行时。

使用上下文关键字 dynamic 声明动态类型:


dynamic d = GetSomeObject();
d.OneMethod();

动态类型期望 d 的运行时类型具有OneMethod 方法。

由于d是动态的,编译器会将OneMethod绑定到d,直到运行时。

动态转化

动态类型具有来自所有其他类型的隐式转换:


int i = 7;
dynamic d = i;
long j = d; // No cast required (implicit conversion)

要使转换成功,动态对象的运行时类型必须可隐式转换为目标静态类型。

以下示例会抛出RuntimeBinderException,因为int不能隐式转换为short:


int i = 7;
dynamic d = i;
short j = d; // throws RuntimeBinderException

var vs dynamic

var 使编译器找出类型。

dynamic
使运行时确定类型。

为了显示:


dynamic x = "hello"; // Static type is dynamic, runtime type is string
var y = "hello";     // Static type is string, runtime type is string

int i = x; // Runtime error
int j = y; // Compile-time error

var 声明的变量的静态类型可以是动态的:


dynamic x = "hello";
var y = x; // Static type of y is dynamic
int z = y; // Runtime error

动态表达式

字段,属性,方法,事件,构造函数,索引器,运算符和转换都可以动态调用。

涉及动态操作数的表达式通常本身是动态的:


dynamic x = 2;
var y = x * 3; // Static type of y is dynamic

将动态表达式转换为静态类型会生成静态表达式:


dynamic x = 2;
var y = (int)x; // Static type of y is int

构造函数调用总是产生静态表达式。

在此示例中,x静态类型为StringBuilder:


dynamic capacity = 1;
var x = new System.Text.StringBuilder (capacity);
阅读全文
以上是编程学为你收集整理的c#动态绑定事件 C# 动态绑定全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 编程学 bianchengxue.com 版权所有 联系我们
桂ICP备19012293号-7 返回底部