C# 中的反射、特性与动态编程
1. 特性相关
特性(Attributes)在编程中扮演着重要角色。例如SerializableAttribute对应的 CIL 代码如下:
beforefieldinit Person extends [mscorlib]System.Object { } // end of class Person而一般的特性(包括大多数预定义特性)通常出现在类定义内部,如下所示:
.class private auto ansi beforefieldinit Person extends [mscorlib]System.Object { } // end of class Person这里的CustomAttribute是装饰特性的全名。SerializableAttribute在元数据表中表现为一个设置位,它属于伪特性,即用于在元数据表中设置位或字段的特性。
2. 动态对象编程
C# 4.0 引入动态对象简化了许多编程场景,并开启了一些之前无法实现的新场景。使用动态对象编程的核心是,开发者能够使用动态调度机制编写操作代码,运行时会在执行阶段解析这些操作,而非在编译时由编译器进行验证和绑定。
在很多情况下,对象本质上不是静态类型的。比如从 XML/CSV 文