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 });
动态绑定会将类型,成员和操作的解析过程从编译时延迟到运行时。
使用上下文关键字 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
使编译器找出类型。
使运行时确定类型。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# XML文档文档注释是用于记录类型或成员的嵌入式XML。文档注释紧接在类型或成员声明之前,并以三个斜杠开头:/// summaryCancel...
C# 交错数组 C# 数组交错数组是数组的数组。您可以声明一个带有 int 值的交错数组 scores,如下所示:int [][] scores;声明一个...
C# Array 类 C# 数组Array 类是 C# 中所有数组的基类,它是在 System 命名空间中定义。Array 类提供了各种用于数组的属性和方法...
C# 动态数组(ArrayList) C# 集合动态数组(ArrayList)代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是...