《Inside C#》笔记(十四) 反射
通过反射可以在运行时动态地获取一个应用的元数据。
一 反射相关的类和方法
与反射相关的类处在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#》笔记(十四) 反射的更多相关文章
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:/ ...
- (C/C++学习笔记) 十四. 动态分配
十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...
- SharpGL学习笔记(十四) 材质:十二个材质球
材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...
- TCP/IP详解 笔记十四
TCP/IP协议(二) 连接的建立与终止 tcpdump -S输出TCP报文的格式 格式: 源>目的:标志 (标志就是tcp头部).标识首字符意义如下: 例如:telnet 某服务的输出(包括 ...
- 【转】angular学习笔记(十四)-$watch(1)
本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: ...
- yii2源码学习笔记(十四)
Module类是模块和应用类的基类. yiisoft\yii2\base\Module.php <?php /** * @link http://www.yiiframework.com/ * ...
- How tomcat works 读书笔记十四 服务器组件和服务组件
之前的项目还是有些问题的,例如 1 只能有一个连接器,只能处理http请求,无法添加另外一个连接器用来处理https. 2 对容器的关闭只能是粗暴的关闭Bootstrap. 服务器组件 org.apa ...
- SpringBoot笔记十四:消息队列
目录 什么是消息队列 消息队列的作用 异步通信 应用解耦 流量削峰 RabbitMQ RabbitMQ流程简介 RabbitMQ的三种模式 安装RabbitMQ RabbitMQ交换器路由和队列的创建 ...
随机推荐
- python循环语句详细讲解
想必大家都知道python循环语句吧,可以python循环语句有多种,比如for循环.while循环.if.else等等, 我们可以通过设置条件表达式永远不为 false 来实现无限循环,实例如下 ...
- asp.net mvc开发过程中的一些小细节
现在做网站用mvc越来越普及了,其好处就不说了,在这里只记录一些很多人都容易忽视的地方. 引用本地css和js文件的写法 这应该是最不受重视的地方,有同事也说我有点小题大作,但我觉得用mvc还是得有一 ...
- LoadRunner通过SiteScope监控MySQL的性能
步骤: 安装 SiteScope 下载 Java 版的MySQL 驱动, 下载地址:http://www.mysql.com/downloads/connector/j/ 下载成功后,把解压缩的 my ...
- Oracle 基本知识回顾
1.查找数据库所用的字符集编码:SELECT USERENV('language') FROM DUAL;2.将一个表中的字段,插入到这个表:INSERT INTO TABLE SELECT * FR ...
- 以ActiveMQ为例JAVA消息中间件学习【3】——SpringBoot中使用ActiveMQ
前言 首先我们在java环境中使用了ActiveMQ,然后我们又在Spring中使用了ActiveMQ 本来这样已经可以了,但是最近SpringBoot也来了.所以在其中也需要使用试试. 可以提前透露 ...
- SQL 必知必会·笔记<16>使用视图
1.视图 视图是虚拟的表.与包含数据的表不一样,视图只包含使用时动态检索数据的查询. 为什么使用视图 重用SQL 语句 简化复杂的SQL 操作.在编写查询后,可以方便地重用它而不必知道其基本查询细节 ...
- Docker国内仓库和镜像
由于网络原因,我们在pull Image 的时候,从Docker Hub上下载会很慢...所以,国内的Docker爱好者们就添加了一些国内的镜像(mirror),方便大家使用. 一.国内Docker仓 ...
- Python 浅谈编程规范和软件开发目录规范的重要性
最近参加了一个比赛,然后看到队友编程的代码,我觉得真的是觉得注释和命名规范的重要性了,因为几乎每个字符都要咨询他,用老师的话来说,这就是命名不规范的后续反应.所以此时的我意识到写一篇关于注释程序的重要 ...
- C# 获取用户IP地址(转载)
[ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...
- 【Mybatis】1、Mybatis拦截器学习资料汇总
MyBatis拦截器原理探究 http://www.cnblogs.com/fangjian0423/p/mybatis-interceptor.html [myBatis]Mybatis中的拦截器 ...