C# 反射(Reflection)技术

本文参考自C#反射(Reflection)详解,纯属学习笔记,加深记忆

在介绍反射前,先介绍一个重要的知识点         .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、在程序的运行期得到类型信息有什么用?

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值