http://blog.csdn.net/lianjiangwei/article/details/47207875

什么是反射?

反射提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。

反射机制是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。

通俗的来讲,就是反射是通过一个对象去了解另一个对象的内部结构和信息,即使在你不知道那个对象存在的情况下。就好比是海船的声纳探测一样,我们并不知道海水深处是什么情况,但是通过声呐反射回来的情况,就可以掌握障碍物的大小,移动速度等等,和我们所谈论的反射是一个道理。但是我们在程序使用反射不仅可以获取,类的内部情况,还可以操作调用反射类的方法,简直是太神奇了。

为什么用反射?

1使用了反射后,你的程序在更新的时候无需重新编译,只要将更新的Dll换掉即可完成程序的更新和升级。

2将反射和配置文件相结合,可以开发出功能随意增删改的软件,具备了极大地灵活性和扩展性。

3反射提高了程序的灵活性,降低了耦合性,提高了自适应能力,同时也大大提高了程序的复用性。

但是要强调的一点是,任何事物都有两面性,不是所有场合都适合使用反射技术的。使用反射也会有其缺点:

1首先带来的一个很大的问题就是——性能问题,使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。

2使用反射会使程序内部逻辑模糊化,程序员在调试代码的时候西瓦昂看到清晰的程序逻辑,而反射却绕过了源代码,因此会带来一定的维护性问题,同时反射代码比相应的直接代码更加复杂。

综上所述:反射机制有其适用的场合,只要用来开发对灵活性和扩展性要求很高的软件系统,普通的程序没必要使用。

怎么用反射?

首先声明我对反射的使用不是很深入,只是做了一些简单的尝试,下面用一个小Demo来说明如何在C#中使用反射获取一个类的属性、方法以及修改属性和调用方法等。代码如下:

首先我们先写一个目标类Student

  1. <span style="font-size:18px;">using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace ITOO.Reflection.Student
  6. {
  7. public class Student
  8. {
  9. public string Name { get; set; }
  10. public int Age { get; set; }
  11. // 默认构造函数
  12. public Student()
  13. {
  14. this.Age = 24;
  15. this.Name = "连江伟";
  16. }
  17. //带参数的构造函数
  18. public Student(string name,int age)
  19. {
  20. this.Name = name;
  21. this.Age = age;
  22. }
  23. public void Hello()
  24. {
  25. Console.WriteLine("我是"+Name +",我今年"+Age +"岁了!");
  26. }
  27. }
  28. }</span>

然后我们在控制台应用程序中去利用反射操纵这个类

  1. <span style="font-size:18px;">using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Reflection;
  6. namespace ITOO.Reflection.Client
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. //动态加载DLL,这个LoadFile最方便,参数就是dll的路径。
  13. var asm = Assembly.LoadFile(@"C:\Users\ljw\Desktop\学习例子\ITOO.Reflection.Test\ITOO.Reflection.Student\bin\Debug\ITOO.Reflection.Student.dll");
  14. //获取Student类的类型
  15. var type = asm.GetType("ITOO.Reflection.Student.Student");
  16. //创建该类的实例
  17. var instance = asm.CreateInstance("ITOO.Reflection.Student.Student");
  18. //为学生类的属性赋值
  19. type.GetProperty("Name").SetValue(instance, "段天涯", null);
  20. type.GetProperty("Age").SetValue(instance, 18, null);
  21. //获取Student类的方法
  22. var method = type.GetMethod("Hello");
  23. //调用Student类的成员方法Hello
  24. method.Invoke(instance, null);
  25. Console.Read();
  26. }
  27. }
  28. }</span>

小结一下:对于反射这个概念,一开始我是比较模糊的,虽然很多次的听到别人在说在讲,但是由于没有自己去查资料去研究,去动手代码实现,终究不能感同身受,理解其中的原理和思想,如今阅读了大量的博客和文章之后,又动手实践了一下,有了一些浅浅的理解,由于Donet的反射机制是封装好的,所以对于反射内部实现原理还不清楚,期待以后能够继续深入学习。

【C#】:浅谈反射机制 【转】的更多相关文章

  1. 浅谈 Attention 机制的理解

    什么是注意力机制? 注意力机制模仿了生物观察行为的内部过程,即一种将内部经验和外部感觉对齐从而增加部分区域的观察精细度的机制.例如人的视觉在处理一张图片时,会通过快速扫描全局图像,获得需要重点关注的目 ...

  2. c#浅谈反射内存的处理

    这段时间由于公司的项目的要求,我利用c#的反射的机制做了一个客户端框架.客户端里的所有的模块都是以一定形式进行提供,例如:FORM,UserControl. 在做的过程中很简单与愉快.具体的过程如下: ...

  3. 反射入门-浅谈反射用途_根据Ado游标对象创建list集合

    本人大二菜鸟一只,今天在上课期间有个同学看着C#反射的内容说反射没什么用,一时之间也想不到什么更好的例子,就写了个根据泛型类型和游标反射创建List集合的Demo. 首先创建一个用于封装对应数据的en ...

  4. 浅谈fail-fast机制

    fail-fast机制即为快速失败机制,个人认为是一种防护措施,在集合结构发生改变的时候,使尽全力抛出ConcurrentModificationException,所以该机制大部分用途都是用来检测B ...

  5. CountDownLatch、CyclicBarrier、Samephore浅谈三大机制

    CountDownLatch.CyclieBarrier与SamePhore都可用来控制线程的执行,那么他们之间有什么区别呢 CountDownLatch CountDowenlatch可以看成一个线 ...

  6. java反射机制浅谈

    一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  7. java的反射机制浅谈(转)

    原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  8. 浅谈Java的反射机制和作用

    浅谈Java的反射机制和作用 作者:Java大师 欢迎转载,转载请注明出处 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象 ...

  9. 浅谈java反射机制

    目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...

随机推荐

  1. apche服务器在Window和Linux下常用命令

    1.Window 1.1 启动.重启.停止——方式一(httpd) httpd.exe [-D name] [-d directory] [-f file] [-C "directive&q ...

  2. loadrunner中文件的操作

    loadrunner中文件的操作 我们可以使用fopen().fscanf().fprintf().fclose()函数进行文件操作,但是因为LoadRunner不支持FILE数据类型,所以我们需要做 ...

  3. 使用CMake,且在GCC编译时指定相对源代码路径选项BUG的问题

    CMake的build.make,每次都是cd xxx目录,然后再编译 而编译时,GCC会取当前路径保存进调试信息的DT_AT_comp_dir,GCC的编译器选项-fdebug-prefix-map ...

  4. 如何通过 Redis 实现分布式锁

    分布式锁需要解决的问题: 互斥性:任意时刻只能有一个客户端获取锁 安全性:锁只能被持有该锁的客户端删除 死锁:获取锁的客户端因为意外宕机未能释放锁,其他客户端再也无法获取到该锁导致死锁 容错:宕机后客 ...

  5. ExtJs基础

    方法和属性 Ext.caeate方法相当于创建一个实例对象 renderTo:Ext.getBody()  新创建的组件渲染到什么位置 grid.render('grid-example'); /re ...

  6. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Office Keys(思维)

    Office Keys time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  7. MYSQL注入天书之导入导出介绍

    Background-3 导入导出相关操作的讲解 load_file()导出文件 Load_file(file_name):读取文件并返回该文件的内容作为一个字符串. 使用条件: A.必须有权限读取并 ...

  8. 【分块】【bitset】hdu6085 Rikka with Candies

    给你数组A和B,A B中的元素大小都不超过5w,且两两不同. q次询问,每次给你个k,问你有多少对(i,j),满足A(i)%B(j)==k. 如题目所言模拟bitset的过程,实质上是个分块,每块的大 ...

  9. 【欧拉回路】【Fleury算法】CDOJ1642 老当益壮, 宁移白首之心?

    题意: 构造一个01串,使得满足以下条件: 1. 环状(即首尾相连) 2. 每一位取值为0或1 3. 长度是2^n 4. 对于每个(2^n个)位置,从其开始沿逆时针方向的连续的n位01串(包括自己) ...

  10. 【搜索】bzoj3109 [cqoi2013]新数独

    搜索,没什么好说的.要注意读入. Code: #include<cstdio> #include<cstdlib> using namespace std; ][]= {{,, ...