zoukankan      html  css  js  c++  java
  • C# 的反射和映射

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

    1.运用反射调用其它程序集中的方法:   
      假设另一个工程中的所有类都编译到一个dll文件中了,在这很多的类当中,有一个类叫StringUtil,名称空间在 HSMP.CommonBasic.Common下   
      该类中有一个方法:   
      public   double   GetSum(double   x,double   y)   
      {   
      return   x+y;   
      }   
      编译后dll文件的存放路径是:D:TestHSMP.CommonBasic.dll   
      现在的问题是,如何通过程序调用该dll文件中的GetSum方法   
      大概有以下几步:   
      using   System.Reflection;   
      A.   
      //这里要用LoadFrom,只有在本工程里添加了该dll的引用后才可以使用Load   
      Assembly   objAss   =   Assembly.LoadFrom(@"D:TestHSMP.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
  • 相关阅读:
    nagle算法和TCP_NODELAY
    Makefile 中的.PHONY
    Linux--信号阻塞与屏蔽
    Linux的SIGUSR1和SIGUSR2信号
    Github和Git上fork指南
    Python 中函数的 收集参数 机制
    【奥斯卡理财星体系 第二章】丨你该如何做好理财规划
    【奥斯卡理财星体系 第一章】丨你该如何找到理财正确的方向
    【奥斯卡理财星体系 序篇】为什么你需要学习这个理财体系?
    零基础学基金投资系列-08-基金排行榜
  • 原文地址:https://www.cnblogs.com/dullbaby/p/4117958.html
Copyright © 2011-2022 走看看