最近想研究一下反射,先上网找了找资料,几乎大部分都是照抄MSDN的内容,生涩难懂,几乎没说,又找了找,发现一些强人的实例解析,才稍微有了 点门道,个人感觉,反射其实就是为了能够在程序运行期间动态的加载一个外部的DLL集合,然后通过某种办法找到这个DLL集合中的某个空间下的某个类的某 个成员(通过反射可以访问该类所包含的所有成员,不论成员是公有还是私有),看看网上N人写的实例:

1.运用反射调用其它程序集中的方法:   
  假设另一个工程中的所有类都编译到一个dll文件中了,在这很多的类当中,有一个类叫StringUtil,名称空间在 HSMP.CommonBasic.Common下   
  该类中有一个方法:   
  public   double   GetSum(double   x,double   y)   
  {   
  return   x+y;   
  }   
  编译后dll文件的存放路径是:D:\Test\HSMP.CommonBasic.dll   
  现在的问题是,如何通过程序调用该dll文件中的GetSum方法   
  大概有以下几步:   
  using   System.Reflection;   
  A.   
  //这里要用LoadFrom,只有在本工程里添加了该dll的引用后才可以使用Load   
  Assembly   objAss   =   Assembly.LoadFrom(@"D:\Test\HSMP.CommonBasic.dll");   
  //HSMP.CommonBasic.Common.StringUtil类的全路径   
  Type   t=objAss.GetType("HSMP.CommonBasic.Common.StringUtil");     
  //动态生成类StringUtil的实例   
  object   obj=System.Activator.CreateInstance(t);   
  //参数信息,GetSum需要两个int参数,如果方法没有参数,就声明一个长度为0的数组   
  System.Type[]   paramTypes   =   new   System.Type[2];   
  paramTypes[0]   =   System.Type.GetType("System.Int32");   
  paramTypes[1]   =   System.Type.GetType("System.Int32");   
  //找到对应的方法   
  MethodInfo   p   =   t.GetMethod("SayHello",   paramTypes)   
  //参数值,如果所调用的方法没有参数,不用写这些   
  Object[]   parameters   =   new   Object[2];   
  parameters[0]   =   3;   
  parameters[1]   =   4;   
  object   objRetval   =   p.Invoke(obj,   parameters);   //如果没有参数,写null即可。

2.动态加载, 更改, 增加...某个程序集
下面例子中, ChangeValue类的myValue本是私有字段, 
一般情况下在类外部是不能改它的值的, 但利用反射就能改了
-----------------------------------------------------
using System;
using System.Reflection;

class ChangeValue 
{
private string myValue;
public ChangeValue(string str)
{
myValue = str;
}
public void WriteLine()
{
Console.WriteLine("MyValue is: " + myValue);
}
}
class Test
{
public static void Main(string[] args)
{
ChangeValue cv = new ChangeValue("old value");
cv.WriteLine();

Type t = cv.GetType(); 
FieldInfo field = t.GetField("myValue", 
BindingFlags.NonPublic |BindingFlags.Instance);
field.SetValue(cv, "new value");

cv.WriteLine(); 
}
}
----------------------------------------------------
再打个比方, 你要写一个播放器, 要支持如mp3, wmv, avi...等格式,
你还希望用户能自己安装一个新的格式, 也就是我们常说的插件.
在实现这些, 可能你要将每种格式都写成单个的解码程序集, 如
mp3.dll, wmv.dll, avi.dll....
这样当播放时, 根据扩展名去动态调用相应的解码程序集, 那么这时你就得
用反射去动态加载这些dll了.如: Assembly.LoadFile ("...avi.dll")
然后通过反射可以用avi.dll里面定义的类了

转自:http://www.cnblogs.com/kingcat/archive/2007/09/03/879873.html

C# 的反射和映射的更多相关文章

  1. Golang中Struct与DB中表字段通过反射自动映射 - sqlmapper

    Golang中操作数据库已经有现成的库"database/sql"可以用,但是"database/sql"只提供了最基础的操作接口: 对数据库中一张表的增删改查 ...

  2. Java开发培训基础知识解析之反射机制

    Java是老牌编程语言,是当前应用最广泛的编程语言之一.想要学习Java你就一定要掌握Java基础知识,而反射对于初学Java的人来说绝对是非常重要的知识点.什么是反射?如何理解反射机制?如何使用反射 ...

  3. Java知识系列 -- 反射

    原理 要想理解 Java 反射,首先要弄清类的加载过程. 比如这行代码 Person p = new Person();. 我们想要创建一个 Person 对象,并用 p 作为对象的引用. 在 Jav ...

  4. MFC_1.3 控件子类化 消息反射

    控件子类化 如果想要在默认的控件类中添加一些功能,就需要子类化一个控件类 在类内可以响应控件所有的消息,并且可以添加自己的函数和数据 通过类向导子类化控件的步骤 打开类向导,创建一个 MFC 类,不要 ...

  5. Spring的数据库开发

                                Spring JDBC框架操作mysql数据库 Spring中的JDBC为我们省去连接和关闭数据库的代码,我们着重关注对数据库的操作.Sprin ...

  6. windows消息机制详解(转载)

    消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序.消息本身是作为一个记录传递给应用程序的 ...

  7. .Net MVC中的路由

    MVC中的URL也就是路由,不用通过路径访问实际的物理文件而达到向用户展示界面. URL的路由功能 一方面正向 映射到Controller和Action,根据用户输入的URL触发相应的控制器和对应方法 ...

  8. Cause: org.apache.ibatis.reflection.ReflectionException: Could not set property 'orderdetails' of 'class com.luchao.mybatis.first.po.Orders' with value 'Orderdetail [id=null, ordersId=3, itemsId=1, it

    从上面异常的解释来看是因为反射不能将Orders设置到orderdetails属性上,仔细检查了MyBatis的配置文件,发现: <collection property="order ...

  9. 【Unity Shaders】学习笔记——SurfaceShader(四)用纹理改善漫反射

    [Unity Shaders]学习笔记——SurfaceShader(四)用纹理改善漫反射 转载请注明出处:http://www.cnblogs.com/-867259206/p/5603368.ht ...

随机推荐

  1. 阿里云ECS屏蔽25端口,官方建议使用465 SSL端口发送邮件

    阿里云ECS  VPC网络,搭建了zabbix,想通过三方邮件系统发送邮件,本机开虚拟机测试发邮件一切正常,到阿里ECS的时候邮件各种发不出去,到处找原因,最后度娘告诉了我真想,原来阿里把25端口屏蔽 ...

  2. 1007 Maximum Subsequence Sum (PAT(Advance))

    1007 Maximum Subsequence Sum (25 分)   Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A ...

  3. 原生js实现三个按钮绑定三个计时器,点击其中一个按钮,开启当前计时器,另外另个不开启

    今天在某个前端交流群,有个小伙伴问了一个小功能,自己想了一下,代码如下,可以实现基本功能: 下面是html结构 <div id="demo"> <input ty ...

  4. AtCoder Beginner Contest 131 Solution

    前言 这次ABC还是有一点难度的吧. TaskA Security Solution 直接模拟就好了. Code /* mail: mleautomaton@foxmail.com author: M ...

  5. 【Codeforces 584C】Marina and Vasya

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 设cnt表示s1和s2不同的字符的个数 如果cnt>2t 因为这cnt个位置肯定至少有一边不同 显然肯定会有一个f(s,S)的值大于t的 ...

  6. Sigmoid Function

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51734189 Sigmodi 函数是一 ...

  7. HDU 1540 区间合并线段树

    题目大意: 就是给定一堆位置,进行删除还原,最后找到 t 位置上的最大连续位置 #include <cstdio> #include <cstring> #include &l ...

  8. 总结for循环及for循环增强遍历数组,list,set和map

    一.对于集合 (1)普通for循环 int[] arr = { 2, 1, 2 }; for(int i=0;i<arr.length;i++){ System.out.println(arr[ ...

  9. B树、B-树、B+树、B*树介绍,和B+树更适合做文件索引的原因

    今天看数据库,书中提到:由于索引是采用 B 树结构存储的,所以对应的索引项并不会被删除,经过一段时间的增删改操作后,数据库中就会出现大量的存储碎片, 这和磁盘碎片.内存碎片产生原理是类似的,这些存储碎 ...

  10. HDU——1267 下沙的沙子有几粒?

    下沙的沙子有几粒? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...