“反射”在C#编程中的应用

来源:互联网 发布:中国的权贵阶层 知乎 编辑:程序博客网 时间:2024/04/30 23:32

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

 

其主要的作用是:

  • 需要访问程序元数据的属性。(元数据被定义为:在程序中不是被加工的对象,而是通过其值的改变来改变程序的行为的数据。)

  • 检查和实例化程序集中的类型。

  • 在运行时构建新类型。使用 System.Reflection.Emit 中的类。

  • 执行后期绑定,访问在运行时创建的类型的方法。请参见主题动态加载和使用类型

  •  

    封装是面向对象编程中常用的方法,具体针对反射的作用来说,动态创建类型并绑定到现有对象是最重要的应用。

     

    下面通过一个具体实例对其用法进行说明(实例代码参照http://www.cnblogs.com/fineboy/archive/2006/10/10/525348.html博文)

     

    (假如DLL的文件名是TestReflect.dll)

    首先创建一个动态链接库

     1using System;
     2
     3namespace Webtest
     4{
     5 /**//// <summary>
     6 /// ReflectTest 的摘要说明。
     7 /// </summary>
     8 public class ReflectTest
     9 {
    10  public ReflectTest()
    11  {}
    12
    13  public string WriteString(string s)
    14  {
    15   return "欢迎您," + s;
    16  }
    17
    18  /**//// <summary>
    19  /// dsajkjflasjdfalksdjfaskfd
    20  /// </summary>
    21  /// <param name="s"></param>
    22  /// <returns></returns>
    23  public static string WriteName(string s)
    24  {
    25   return "欢迎您光临," + s;
    26  }
    27
    28  public string WriteNoPara()
    29  {
    30   return "您使用的是无参数方法";
    31  }
    32 }
    33}

     

    下面是具体调用方法:

     

     1public void test1()
     2  {
     3   System.Reflection.Assembly ass;
     4   Type type ;
     5   object obj;
     6   try
     7   {
     8    ass = System.Reflection.Assembly.LoadFile(@"d:/TestReflect.dll");
     9    type = ass.GetType("Webtest.ReflectTest");//必须使用名称空间+类名称
    10    System.Reflection.MethodInfo method = type.GetMethod("WriteString");//方法的名称
    11    obj = ass.CreateInstance("Webtest.ReflectTest");//必须使用名称空间+类名称
    12    string s = (string)method.Invoke(obj,new string[]{"jianglijun"}); //实例方法的调用
    13   
    14    Response.Write(s+"<br>");
    15    method = type.GetMethod("WriteName");//方法的名称
    16    s = (string)method.Invoke(null,new string[]{"jianglijun"}); //静态方法的调用
    17    Response.Write(s+"<br>");
    18
    19    method = type.GetMethod("WriteNoPara");//无参数的实例方法
    20    s = (string)method.Invoke(obj,null);
    21    Response.Write(s+"<br>");
    22    method = null;
    23   }

    24   catch(Exception ex)
    25   {
    26    Response.Write(ex+"<br>");
    27   }

    28   finally
    29   {
    30    ass = null;
    31    type = null;
    32    obj = null;
    33   }

    34  }

    原创粉丝点击