专栏首页GreenLeavesC# 反射(Reflection)技术

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 条评论
登录 后参与评论

相关文章

  • FactoryMethod工厂方法模式(创建型模式)

    整个抽象的游戏设施建造系统相对变化较慢,本例中只有一个Build的创建方法,而Build内部的方法实现,该实现依赖与各种具体的实现,而这些实现变化的非常频繁,现...

    郑小超.
  • 领域驱动系列五模型驱动设计的构造块

    为了保证软件实现的简洁性,并且与模型保持一致,不管实际情况有多复杂,必须使用建模和设计的最佳实践,即让通过我们的编程技术(设计模型、指责驱动、契约式设计)充分地...

    郑小超.
  • FactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式

    具体参考抽象工厂(AbstractFactory)模式-创建型模式,本文在FactoryMethod工厂方法模式(创建型模式)的基础上进行业务进一步抽象,不做详...

    郑小超.
  • C#开发BIMFACE系列32 服务端API之模型对比3:批量获取模型对比状态

      在《C#开发BIMFACE系列31 服务端API之模型对比2:获取模型对比状态》中介绍了根据对比ID,获取一笔记录的对比状态。由于模型对比是在BIMFACE...

    张传宁老师
  • 自动驾驶创业公司里,第一个IPO的可能是它

    夏乙 编译整理 量子位 出品 | 公众号 QbitAI 最近一两年,自动驾驶行业的火热程度有目共睹。 不用说科技巨头一个接一个地下注,原本不看好这股潮流的汽车厂...

    量子位
  • spring的AOP知识点2.0

    一AOP相关概念 Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.

    东风冷雪
  • AI小程序,下一个5年最好的创业机会

    这意味着,过去20年才能积累的财富,现在不到一年就可以搞定,如果你运气足够好,还可能更快。

    用户1745481
  • AI小程序,下一个5年最好的创业机会

    这意味着,过去20年才能积累的财富,现在不到一年就可以搞定,如果你运气足够好,还可能更快。

    用户1745481
  • 茶馆专用小程序,掌柜们了解一下?

    去茶馆喝喝茶一直是追求生活品质的同仁们比较追捧的,不管是现在还是古代都是如此,而且茶馆的装修多是古色古香居多,但是我们生活习惯演变的非常快,借助移动互联网这班快...

    微盛企微管家
  • 腾讯安全和安徽征信达成战略合作,共同探索数据技术在智慧金融、智慧政务等领域的应用

    7月13日,腾讯安全和安徽省征信股份有限公司(以下简称“安徽征信”)在深圳签署了战略合作协议,安徽征信董事长阮传宏、副总裁朱婷红、市场总监董飞,腾讯集团副总裁马...

    腾讯安全

扫码关注云+社区

领取腾讯云代金券