
反射、元数据和动态编程
C# 基础
singhwong
C#,UWP,.Net
展开
-
五、不安全的代码
如前所述,C#非常擅长于对开发人员隐藏大部分基本内存管理,因为它使用了垃圾收集器和引用。但是,有时需要直接访问内存。例如,由于性能问题,要在外部(非.NET环境)的DLL中访问一个函数,该函数需要把一个指针当作参数来传递(许多Windows API函数就是这样)。本节将讨论C#直接访问内存的内容的功能。1.用指针直接访问内存下面把指针当作一个新论题来介绍,而实际上,指针并不是新东西。因...原创 2020-04-18 03:38:12 · 769 阅读 · 0 评论 -
六、DynamicObject和ExpandObject概述
如果要创建自己的动态对象,该怎么办?有两种方法:从DynamicObject中派生,或者使用ExpandObject。使用DynamicObject需要做的工作较多,因为必须重写几个方法。ExpandObject是一个可立即使用的密封类。1. DynamicObject考虑一个表示人的对象。一般应定义名字、中间名和姓氏等属性。现在假定要在运行期间构建这个对象,且系统事先不知道该对象有什么属...原创 2020-04-08 15:18:44 · 1497 阅读 · 0 评论 -
五、dynamic类型
dynamic类型允许编写忽略编译期间的类型检查的代码。编译器假定,给dynamic类型的对象定义的任何操作都是有效的。如果该操作无效,则在代码运行之前不会检查该错误,如下面的示例所示: class Program { static void Main(string[] args) { var staticPerson = ...原创 2020-04-06 17:36:10 · 1272 阅读 · 0 评论 -
四、为反射使用动态语言扩展
前面一直使用反射来读取元数据。还可以使用反射,从编译时还不清楚的类型中动态创建实例。下一个示例显示了创建Calculator类的一个实例,而编译器在编译时不知道这种类型。程序集CalculatorLib是动态加载的,没有添加引用。在运行期间,实例化Calculator对象,调用方法。知道如何使用ReflectionAPI后,使用C# dynamic关键字可以完成相同的操作。这个关键字自C#4版本以...原创 2020-04-04 23:49:05 · 212 阅读 · 0 评论 -
三、反射(C#)
本节先介绍System.Type类,通过这个类可以访问关于任何数据类型的信息。然后简要介绍System.Reflection.Assembly类,它可以用于访问给定程序集的相关信息,或者把这个程序集加载到程序中。最后把本节的代码和上一节的代码结合起来,完成WhatsNewAttributes示例。1. System.Type类这里使用Type类只为了存储类型的引用:Type t = ...原创 2020-04-02 16:58:39 · 261 阅读 · 0 评论 -
二、自定义特性
前面介绍了如何在程序的各个数据项上定义特性。这些特性都是Microsoft定义好的,作为.NET Framework类库的一部分,许多特性都得到了C#编译器的支持。对于这些特殊的特性,编译器可以以特殊的方式定义编译过程,例如,可以根据StructLayout特性中的信息在内存中布置结构。.NET Framework也允许用户定义自己的特性。显然,这些特性不会影响编译过程,因为编译器不能识别它们...原创 2020-04-02 15:14:23 · 342 阅读 · 0 评论 -
一、在运行期间检查代码和动态编程
本章讨论自定义特性、反射和动态编程。自定义特性允许把自定义元数据与程序元素关联起来。这些元数据是在编译过程中创建的,并嵌入到程序集中。反射是一个普通术语,它描述了在运行过程中检查和处理程序元素的功能。例如,反射允许完成以下任务:枚举类型的成员 实例化新对象 执行对象的成员 查找类型的信息 查找程序集的信息 检查应用于某种类型的自定义特性 创建和编译新程序集这个列表列出了许多功能,...原创 2020-04-01 11:57:29 · 301 阅读 · 0 评论