通过反射可以在运行时动态地获取一个应用的元数据。

一 反射相关的类和方法

与反射相关的类处在System.Reflection命名空间下,包括Assembly、Module、MethodInfo、FieldInfo、PropertyInfo、EventInfo。

a)Type类

System.Type类是反射机制的核心。Type类本身是一个抽象类,代表CTS通用类型系统中的某个类型。

对于已经实例化的对象,可以使用<对象名称>.GetType()来取得Type类。另外也可以使用静态方法Type.GetType(“<type name>”)取得未实例化对象的type类。使用第二种方法时,<type name>必须是CTS类型系统的类型名称,而不是C#别名,这可以确保.NET平台下的多语言通用性。

b)使用Type类

通过Type类,可以使用Type.IsByRef\IsClass\IsEnum\IsExplicitLayout\IsInterface\IsPublic\IsSealed等各种各样的方法来取得所需的信息。

二 通过反射使用程序集或模块

程序集是一个包含了若干PE(Portable Executable)文件的物理文件,.NET中对应的类为Assembly。通过Assembly类,可以进行如下操作:

遍历程序集内部的所有类型

取得程序集的所有模块

获取程序集的文件名、物理路径

查看程序集的版本及安全信息

取得程序集的入口

通过方法Assebmbly a= Assembly.LoadFrom(<程序集路径>)可以加载指定的程序集文件,然后Type[] types=a.GetTypes()可以取得程序集中的所有类型组成的数组。

 

三 使用反射实现晚绑定

有些应用场景下,在编译时无法确定所有事情(比如包含哪些DLL),例如一个软件的插件,这时需要使用晚绑定技巧,让软件在运行时动态的决定要加载的DLL或程序集。

具体的方式为

在加载程序集文件并使用GetType()取得所有的类型后,通过使用Type.Is***系列方法做判断,找到所需的type,然后使用Activator.CreateInstance()激活该类型,随后就可以取得MethodInfo并调用Invoke来执行了。

四在运行时创建并执行代码

借助System.Reflection.Emit命名空间的内容,可以在内存动态地定义程序集、模块、类型,并将生成的代码插入程序中执行。

例如,有生成HelloWorld方法的代码:

看起来步骤挺多的,但遵循程序集-模块-类型-方法-方法体这样的创建顺序。然后就可以按照先前的晚绑定方法来使用了。

学习资料:Inside C# by Tom Archer

《Inside C#》笔记(十四) 反射的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:/ ...

  3. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  4. SharpGL学习笔记(十四) 材质:十二个材质球

    材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...

  5. TCP/IP详解 笔记十四

    TCP/IP协议(二)  连接的建立与终止 tcpdump -S输出TCP报文的格式 格式: 源>目的:标志 (标志就是tcp头部).标识首字符意义如下: 例如:telnet 某服务的输出(包括 ...

  6. 【转】angular学习笔记(十四)-$watch(1)

    本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: ...

  7. yii2源码学习笔记(十四)

    Module类是模块和应用类的基类. yiisoft\yii2\base\Module.php <?php /** * @link http://www.yiiframework.com/ * ...

  8. How tomcat works 读书笔记十四 服务器组件和服务组件

    之前的项目还是有些问题的,例如 1 只能有一个连接器,只能处理http请求,无法添加另外一个连接器用来处理https. 2 对容器的关闭只能是粗暴的关闭Bootstrap. 服务器组件 org.apa ...

  9. SpringBoot笔记十四:消息队列

    目录 什么是消息队列 消息队列的作用 异步通信 应用解耦 流量削峰 RabbitMQ RabbitMQ流程简介 RabbitMQ的三种模式 安装RabbitMQ RabbitMQ交换器路由和队列的创建 ...

随机推荐

  1. Appium发送中文或其他语言的问题

    1. 需要在配置信息中增加'unicodeKeyboard' = “True”字段,如下: def driver_weixin(platformVersion="6.0.1",de ...

  2. Using SQLite database in your Windows 10 apps

    MVP可以在channel 9上传视频了,所以准备做个英文视频传上去分享给大家,本文做稿子. Hello everyone, As we all know, SQLite is a great and ...

  3. [EXP]McAfee ePO 5.9.1 - Registered Executable Local Access Bypass

    # Exploit Title: McAfee ePO 5.9.1 Registered Executable Local Access Bypass # Date: 2019-03-07 # Exp ...

  4. 【sping揭秘】20、spring的orm

    面向对象的操作方式,spring统一定义在org.springframework.jdbc.object以RdbmsOperation作为顶层抽象定义 Spring对各种ORM的集成 Spring的集 ...

  5. 各种height 以及判断滚动条是否已拉到页面最底部

    DTD已声明 IEdocument.documentElement.scrollHeight  浏览器所有内容高度 ,document.body.scrollHeight  浏览器所有内容高度docu ...

  6. 用C#学习数据结构之线性表

    什么是线性表 线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract),线性结构的特点是结构中的数据元素之间存在一对一的线性关系.这种一对一的关系指的是数据元素之间的位置关 ...

  7. Jenkins之使用Pyinstaller构建Python应用程序

    目录 1. 极简概述 2. Jenkins配置 2.1 安装JDK 2.2 安装Jenkins 3. 安装Docker 4. 使用PyInstaller构建Python应用程序 4.1 Fork 一个 ...

  8. 火热的线上APP的源码分享,开箱即用

    这篇文章是写给iOS的程序员或产品经理的,同样,对于入门学习iOS开发的人,也是一个很好的实战演练,因为这里分享的是一个已经上架的.拿了源码就能正常运行起来的项目. 在介绍这个项目的源码分享之前,小编 ...

  9. MongoDB 系列文章

    MongoDB 系列文章 本文的内容是基于 MongoDB 4.0 的. 参考于 MongoDB 4.0 官方文档. 搭建 MongoDB从搭建到优化 MongoDB-副本集搭建与管理 管理 Mong ...

  10. 【PyTorch深度学习60分钟快速入门 】Part4:训练一个分类器

      太棒啦!到目前为止,你已经了解了如何定义神经网络.计算损失,以及更新网络权重.不过,现在你可能会思考以下几个方面: 0x01 数据集 通常,当你需要处理图像.文本.音频或视频数据时,你可以使用标准 ...