C#反射一

 反射的作用:
1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型
2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。
3. 反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。

1 需要反射的DLL
using System;
 namespace Webtest
 {
  public class ReflectTest
  {
 public ReflectTest(){}
public string WriteString(string s)
  {
   return "欢迎您," + s;
 }
//静态函数
public static string WriteName(string s)
 {
 return "欢迎您光临," + s;
}
//不带参数的函数
 public string WriteNoPara()
 {
 return "您使用的是无参数方法";
 }
 }
}

应用于反射的例子-在ASPNET页面中加入以下函数:
 public void test1()
 {
 System.Reflection.Assembly ass;
 Type type ;
 object obj;
 try
{
ass = System.Reflection.Assembly.LoadFile(@"d:\TestReflect.dll");//要绝对路径
type = ass.GetType("Webtest.ReflectTest");//必须使用名称空间+类名称
System.Reflection.MethodInfo method = type.GetMethod("WriteString");//方法的名称
obj = ass.CreateInstance("Webtest.ReflectTest");//必须使用名称空间+类名称
string s = (string)method.Invoke(obj,new string[]{"jianglijun"}); //实例方法的调用
或:string s = (string)method.Invoke(obj,Object[] parametors = new Object[]{"param"});
Response.Write(s+"<br>");
method = type.GetMethod("WriteName");//方法的名称
s = (string)method.Invoke(null,new string[]{"jianglijun"}); //静态方法的调用
Response.Write(s+"<br>");

method = type.GetMethod("WriteNoPara");//无参数的实例方法
s = (string)method.Invoke(obj,null);
Response.Write(s+"<br>");
method = null;
}
catch(Exception ex)
{
 Response.Write(ex+"<br>");
}
 finally
 {
 ass = null;
 type = null;
 obj = null;
}
}
--------------------------------------------------------------------------------
具体应用:
假设另一个工程中的所有类都编译到一个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("GetSum",   paramTypes)  
  //参数值,如果所调用的方法没有参数,不用写这些  
  Object[]   parameters   =   new   Object[2];  
  parameters[0]   =   3;  
  parameters[1]   =   4;  
  object   objRetval   =   p.Invoke(obj,   parameters);   //如果没有参数,写null即可。  

posted @ 2007-08-14 15:35  Microbar  阅读(1022)  评论(2编辑  收藏  举报