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、在程序的运行期得到类型信息有什么用?
既然在开发时就能够写好代码,干嘛还放到运行期去做,不光繁琐,而且效率也受影响。这就是个见仁见智的问题了,就跟早绑定和晚绑定一样,应用到不同的场合。有的人反对晚绑定,理由是损耗效率,但是很多人在享受虚函数带来的好处的时侯还没有意识到他已经用上了晚绑定。这个问题说开去,不是三言两语能讲清楚的,所以就点到为止了。
原文作者的看法是:晚绑定能够带来很多设计上的便利,合适的使用能够大大提高程序的复用性和灵活性,但是任何东西都有两面性,使用的时侯,需要再三衡量。
C# 反射(Reflection)技术的更多相关文章
- [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程
[.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...
- [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦
[.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...
- 代理(Proxy)和反射(Reflection)
前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...
- Java的反射基础技术
今天本人给大家讲解一下Java的反射基础技术,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 什么是反射? 反射它是根据字节码文件可以反射出类的信息.字段. ...
- .NET 反射(Reflection)
这节讲一下.NET 中的一个技术:反射(Reflection). 反射是一种很重要的技术,它可以在程序运行时,动态的获取类的实例,并调用实例中的任何方法.它就像一面镜子,映射出一个类的所有细节. ...
- [整理]C#反射(Reflection)详解
本人理解: 装配件:Assembly(程序集) 晚绑定:后期绑定 MSDN:反射(C# 编程指南) -----------------原文如下-------- 1. 什么是反射2. 命名空间与装配件的 ...
- CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)
CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction) 开始 如图所示,本文围绕GLSL里的sam ...
- Golang 反射reflection
反射reflection 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地 反射使用TypeOf和ValueOf函数从接口中获取目标对象信息 反射会将匿名字段作为独立字段(匿名字 ...
- C#反射(Reflection)详解
1. 什么是反射2. 命名空间与装配件的关系3. 运行期得到类型信息有什么用4. 如何使用反射获取类型5. 如何根据类型来动态创建对象6. 如何获取方法以及动态调用方法7. 动态创建委托 1.什么是反 ...
随机推荐
- CSS 形状绘制
最后一个 先放代码 <style type="text/css"> #heart { positio ...
- javascript 如何创建只能执行一次的事件。
document.getElementById("myelement").addEventListener("click", handler); // ha ...
- nginx中级应用
1.安装监控模块 Nginx中的stub_status模块主要用于查看Nginx的一些状态信息. 本模块默认是不会编译进Nginx的,如果你要使用该模块,则要在编译安装Nginx时指定: . /con ...
- kali 下 apache 配置文件
默认的可执行文件 /usr/sbin/apache2 root@ty:/etc/init.d# netstat -anp |grep apache tcp6 ::: :::* LISTEN /apac ...
- C#在线运行
初步完成c#代码的在线编辑. 首先,传回前端的c#在线代码,进行预编译,用CSharpCodeProvider这个方法.设置编译版本3.5 设置编译参数GenerateInMemory:是 ...
- 用Docker自动构建纸壳CMS
纸壳CMS可以运行在Docker上,接下来看看如何自动构建纸壳CMS的Docker Image.我们希望的是在代码提交到GitHub以后,容器镜像服务可以自动构建Docker Image,构建好以后, ...
- layui与多级联动返填
<script> layui.use(['form', 'layer'], function () { $ = layui.jquery; var form = layui.form() ...
- leetcode 48. 旋转图像 java
class Solution { public void rotate(int[][] matrix) { int n = matrix.length; for (int k = 0; k < ...
- Weekly Contest 121
984. String Without AAA or BBB Given two integers A and B, return any string S such that: S has leng ...
- 本机安装mysql服务
Windows 上安装 MySQL Windows 上安装 MySQL 相对来说会较为简单,你需要在 MySQL 下载中下载 Windows 版本的 MySQL 安装包. Download Link: ...