博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 反射(Reflection)技术
阅读量:7099 次
发布时间:2019-06-28

本文共 1655 字,大约阅读时间需要 5 分钟。

本文参考自,纯属学习笔记,加深记忆

在介绍反射前,先介绍一个重要的知识点         .Net应用程序是由程序集(Assembly)、模块(Module)、类型(Class)组成。

1、为什么要用反射

反射提供一种编程的方式,让我们可以在应用程序运行期间获得应用程序的组成部分的信息,例如

(1)、Assembly类可以获取正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例

(2)、Type类可以获取对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等,通过Type类可以得到这些要素的信息,并且调用它

(3)、MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。

诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。

综上所述,反射就是获取应用程序在运行期间获取应用程序的组成部分的相关信息

 

2、命名空间与装配件的关系

(1)、命名空间类似与Java的包,但又不完全等同,因为Java的包必须按照目录结构来放置,命名空间则不需要

(2)、装配件是.Net应用程序执行的最小单位,编译出来的.dll、.exe都是装配件

(3)、装配件和命名空间的关系不是一一对应,也不互相包含,一个装配件里面可以有多个命名空间,一个命名空间也可以在多个装配件中存在

装配件A(也可以称之为DLL程序集A):

namespace  N1{      public  class  AC1{…}      public  class  AC2{…}}namespace  N2{      public  class  AC3{…}      public  class  AC4{…}}

装配件B(也可以称之为DLL程序集B):

namespace  N1{      public  class  BC1{…}      public  class  BC2{…}}namespace  N2{      public  class  BC3{…}      public  class  BC4{…}}

为了方便理解,这里我就称装配件为程序集

这两个程序就都有N1和N2两个命名空间,而且各声明了两个类,这样完全是可以的.

当我们在程序中添加对程序集A的引用,那么就可以在程序中使用N1下面的AC1和AC2,和N2中的AC3和AC4,同样的过程,也适用于程序集B

总结:到这里我们清楚了装配件(程序集)表明一个类型住在哪里,上海的,还是北京的,还是湖州的,而命名空间则是表明一个类型是属于哪个族的,是汉族、回族、畲族....

但是,需要注意的是,上海和湖州都会有汉族人,这不会相互影响

 

3、如何使用装配件(程序集dll)中的类型

装配件(程序集)是一个类型居住的地方,当我们在一个程序中要使用一个类型,必须告诉编译器这个类住在哪里,编译器才能找到它,也就是我们常说的添加程序集的引用,那么如果我们在编写程序的时候,不知道该类型在哪,仅仅是知道它的名称,就不能使用了吗?答案是可以的,这个时候,就需要借助反射技术了,就是在程序运行的时候,提供该类的地址并去找到它。

 

4、在程序的运行期得到类型信息有什么用?

既然在开发时就能够写好代码,干嘛还放到运行期去做,不光繁琐,而且效率也受影响。这就是个见仁见智的问题了,就跟早绑定和晚绑定一样,应用到不同的场合。有的人反对晚绑定,理由是损耗效率,但是很多人在享受虚函数带来的好处的时侯还没有意识到他已经用上了晚绑定。这个问题说开去,不是三言两语能讲清楚的,所以就点到为止了。

原文作者的看法是:晚绑定能够带来很多设计上的便利,合适的使用能够大大提高程序的复用性和灵活性,但是任何东西都有两面性,使用的时侯,需要再三衡量。

 

转载于:https://www.cnblogs.com/GreenLeaves/p/6734196.html

你可能感兴趣的文章
Git理解笔记3
查看>>
WDS和DHCP配置说明
查看>>
深入理解计算机系统6——存储器层次结构
查看>>
【WPF新手快速入门系列】2.绑定
查看>>
MJRefresh tableview基本刷新的封装
查看>>
OpenStack视图
查看>>
有效用例模式阅读笔记一
查看>>
网络爬虫(一)
查看>>
查看Win7系统的cookies
查看>>
mailto调用本地默认客户端发邮件
查看>>
Windows中读写ini文件
查看>>
SQL Server 数据导入
查看>>
cmakelists.txt中配置openg环境出现: undefined reference to symbol 'glLightfv'
查看>>
Android五大布局对象--FrameLayout,LinearLayout,AbsoluteLayout,RelativeLayout,TableLayout
查看>>
JavaScript基础-2
查看>>
python实训第四天
查看>>
5-4-3原则
查看>>
html图像入门
查看>>
C# Mongo Client 2.4.2创建索引
查看>>
我的第四个网页制作:列表标签
查看>>