C# 基础技术积累——反射

基本概念了解:

 程序集(也有叫装配件的):它构成了基于 .NET 的应用程序的部署、版本控制、重用、激活范围和安全权限的基本单元。 它以可执行 (.exe) 文件或动态链接库 (.dll) 文件的形式出现,是 .NET Framework 的生成块。 

  作用:它们向公共语言运行时提供了解类型实现所需要的信息。 可以将程序集看成是构成逻辑功能单元并为一起工作而生成的类型和资源的集合。程序集可以包含一个或多个模块。 

  例如,计划较大的项目时,可以让几个各个开发人员负责单独的模块,并通过组合所有这些模块来创建单个程序集

 命名空间与程序集组织在程序集中定义的对象,个人理解命名空间就像是文件夹,作用也是一样,命名空间避免多义性并简化了引用。说到这,也就大概能够知道命名空间和程序集的关系了:

  程序集的范畴大于命名空间,但并不是包含关系,他俩之间不是一一对应,也不互相包含。因此程序集可以包含多个命名空间,又可以包含其他命名空间,一个命名空间可以在一个程序集中,也可以在多个程序集中。 

  都说类似Java里面的package,可是到现在也没有接触过Java,只好暂时理解为文件夹啦。为什么说是类似呢?因为命名空间不需要严格的按照目录结构去排列。

回归正题:什么是反射(Reflection)?

  定义:这就要从物理上去理解了,最简单的看光的反射就知道了。光的反射需要几个元素:光源,反射体,传播媒介。映射到软件里面其实原理是一样的。

  程序集包含模块,而模块包含类型,类型又包含成员。 .net的反射机制提供了封装程序集、模块和类型的对象。 

  作用:通过 System.Reflection 命名空间中的类以及 System.Type,您可以获取有关已加载的程序集和在其中定义的类型(如类、 接口和 值类型)的信息。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。

       说白了就是.net 中提供的一个编程方式使得我们可以在程序运行期间获得程序集、模块、类型的相关信息。

  这样做的好处?很明显,反射给我们带来的好处之一就是方便!灵活!可以给程序带来扩展上的便捷性!可修改性也将大大增强。

  反射的不利:既然是反射那么就得要有源头!就需要读取元数据(也就是反射源,相当于找到光源)的!从这里大家就可想而知,其性能定将受其影响。

  小结:就像我们的生活!凡事都是有利有弊,好东西往往是双刃剑,权衡利弊后再做决定,用的时候还需要注意一个度的把握。

实例:动态创建对象

 语法:Assembly.Load("程序集名称").CreateInstance("命名空间.类名")

 注意点:一定要引用Reflection这个命名空间。有两种写法:在程序顶端写Using System.Reflection、或者直接在程序代码中写。如下示例:

 顶端写:

<span style="font-family: KaiTi_GB2312; font-size: 18px;">using System;
using System.Collections.Generic;
using System.Linq;
<span style="color: rgb(255, 0, 0);">using System.Reflection;</span></span>

<span style="font-family: KaiTi_GB2312; font-size: 18px;"> 在程序代码中直接写: </span>
<span style="font-family: KaiTi_GB2312; font-size: 18px;">return (IUser)<span style="color: rgb(255, 0, 0);">System.Reflection</span>.Assembly.Load(AssemblyName).CreateInstance(className);</span>

 原理解释:给出需要反射的源,这里是一个类。要找到一个类,就先得载入程序集(相当于类的住址),然后找到其命名空间、还得给出他的名字,这样编译器才能够找到这个类。

 说到这里,细心的童鞋就可能发现一个端倪了,要是不知道这个类的住址?那么是不是意味着,咱们无法进行反反射了,就无法动态创建这个对象了??答案显然是否定的,这样你就太小看反射了。不要忘记,除了动态创建对象外,她还是可以动态获取类型、模块、程序集的相关信息的呢!

那么,如此神奇的魔力,具体是怎么个实现呢?期待后续博客的更新吧!哈哈!

 




你可能感兴趣的:(C# 基础技术积累——反射)