A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sunrise2 高级黑马   /  2014-7-21 09:00  /  1152 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 sunrise2 于 2014-7-21 09:03 编辑

          反射是一种机制,通过这种机制我们可以知道一个未知类型的类型信息.
          比如,有一个对象a,这个对象不是我们定义的,也许是通过网络捕捉到的,也许是使用泛型定义的,但我们想知道这个对象的类型信息, 想知道这个对象有哪些方法或者属性什么的.甚至我们想进一步调用这个对象的方法.关键是现在我们只知道它是一个对象,不知道它的类型,自然不会知道它有哪些方法等信息.这时我们该怎么办?反射机制就是解决这么一个问题的.通过反射机制我们可以知道未知类型对象的类型信息.  
      再比如,我们有一个dll文件,我们想调用里面的类.现在假设这个dll文件的类的定义,数量等不是固定的,是经常变化的.也许某一天你要在这个dll里面增加一个类定义.
          也许你觉得这没什么问题,现在关键是我们在另一个程序集里面要调用这个dll,这是我们的程序必须能够适应这个dll的变化,也就是说即使改变了dll文件的定义也不需要改变我们的程序集.这时候我们就会使用一个未知dll.我们该怎么办?同样,反射机制帮助了我们,我们可以通过反射来实现.说白了,反射就是能知道我们未知类型的类型信息这么一个东西.没什么神秘可讲!

    先讲一个获得程序集信息的例子.
  下面我们来举一个例子.例子的思路是这样的:
    我们有一个dll.该dll里面有许多关于运动的类.每一个类记录了一种体育运动的信息.我们在另外一个程序里面要知道这个dll的信息
         第一步:我们建一个文件Sport.cs.内容如下:
  1.  using System;   
  2. public abstract class Sport  
  3.  {     
  4.  protected string name;   
  5.   public abstract string GetDuration();   
  6.   public abstract string GetName();  
  7.  }
复制代码
       咱们用命令"csc /t:library Sport.cs"编译它.               
      第二步,我们再建一个名为SomeSports.cs的文件,内容如下:
  1. using System;  
  2. public class Football:Sport  
  3. {  
  4.    public Football()  
  5.    {  
  6.       name = "Football";  
  7.    }  
  8.    public override string GetDuration()  
  9.    {  
  10.       return "four 15 minute quarters";  
  11.    }  
  12.       
  13.    public override string GetName()  
  14.    {  
  15.       return name;  
  16.    }  
  17. }  
  18.   
  19.   
  20. public class Hockey:Sport  
  21. {  
  22.    public Hockey()  
  23.    {  
  24.        name = "Hockey";  
  25.    }  
  26.    public override string GetDuration()  
  27.    {  
  28.        return "three 20 minute periods";  
  29.    }  
  30.    public override string GetName()  
  31.    {  
  32.        return name;  
  33.    }  
  34. }  
  35.   
  36. public class Soccer:Sport  
  37. {  
  38.    public Soccer()  
  39.    {  
  40.        name = "Soccer";  
  41.    }  
  42.    public override string GetDuration()  
  43.    {  
  44.        return "two 45 minute halves";  
  45.    }  
  46.    public override string GetName()  
  47.    {  
  48.        return name;  
  49.    }  
  50. }  
复制代码
下面我们用命令"csc /t:library /r:Sport.dll SomeSports.cs"编译该文件.   

 现在我们有了我们的运动信息dll文件.现在我们想通过程序知道里面有哪些类.请进入最后一步:     
          第三步:我们创建文件AssemblyDemo.cs.内容如下:
  1. using System;  
  2. using System.Reflection;  
  3.   
  4. public class AssemblyDemo  
  5. {  
  6.      public static void Main(string[] args)  
  7.      {  
  8.          int i,j;  
  9.          
  10.           if(args.GetLength(0)<1)  
  11.           {  
  12.               Console.WriteLine("usage is AssemblyDemo<library_name>");  
  13.           }  
  14.           else  
  15.           {     
  16.           Assembly assembly=Assembly.LoadFrom(args[0]);           
  17.           Type[] types=assembly.GetTypes();  
  18.           Console.WriteLine(assembly.GetName().Name+"contains the following types");  
  19.         
  20.           for(i=0;i<types.GetLength(0);++i)  
  21.            {  
  22.               Console.WriteLine("\r("+i+") " + types[i].Name);  
  23.            }  
  24.           i=types.Length - 1;  
  25.           Console.Write("make selection(0-"+i+");");  
  26.   
  27.           j=Convert.ToInt32(Console.ReadLine());  
  28.           Console.WriteLine();  
  29.   
  30.                if(types[j].IsSubclassOf(typeof(Sport)))  
  31.                {  
  32.                   ConstructorInfo ci=types[j].GetConstructor(new Type[0]);  
  33.                   Sport sport=(Sport)ci.Invoke(new Object[0]);  
  34.                   
  35.                   Console.WriteLine(sport.GetName() + "has" + sport.GetDuration());  
  36.                }  
  37.                else  
  38.                {  
  39.                   Console.WriteLine(types[j].Name + "is not a sub-class of Sport");  
  40.                }  
  41.           }  
  42.      }  
  43. }  
  44.   
  45. }  
复制代码

     咱们用命令"csc /r:Sport.dll AssemblyDemo.cs"编译该文件. 下面我们用"AssemblyDemo SomeSports.dll"运行该程序.

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马