pursuedream
成功=水平+业务+沟通+判断
反射其实就是动态创建对象:

    这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息,例如:

    Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。
    Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。
    MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。
诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。

1.  Type t = processObj.GetType();   //processObj是传递的参数
    if( t.GetInterface(“ITest”) !=null ) //用与判断传递参数是否实现某一接口

或者:     另外一种获取类型的方法是通过Type.GetType以及Assembly.GetType方法,如:
           Type t = Type.GetType(“myNameSpace.classA”);   //myNameSpace为命名空间

2.  创建对象 使用类Activator来创建该对象的实例

     object objA   =Activator.CreateInstance(t);//这样就可以使用该类,
             //该类必须有无参数的构造函数,否则不与执行

    如果存在有参数的构造函数,那么必须指定

    比如类  class  classA
         { 
            string myValues;
            public classA(string values)
            {   myValues=values;}
            public string getValue(string prefix)
            {
                  return prefix+":"+myValues;
            }
         }


   要执行反射必须指明该构造函数的参数,它必须存在Objcet[]数组中
    object[]  obj=new object[]{“哈哈”};
    Type t = Type.GetType(“myNameSpace.classA”);
    ojbect ojbect=(class)Activator.CreateInstance(t,obj); //根据类型创建对象

3. 调用反射的方法使用类MethodInfo
  //获取方法的信息
   MethodInfo method = t.GetMethod("GetValue");
    //调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值
    BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;
   //GetValue方法的参数
    object[] parameters = new object[]{"Hello"};
     //调用方法,用一个object接收返回值
   
   //调用方法
    Type t 
= Type.GetType(“myNameSpace.classA”);
    
object[]  obj=new object[]{“哈哈”};
    ojbect ojbect
=(class)Activator.CreateInstance(t,obj);

    MethodInfo method 
= t.GetMethod("GetValue");

    BindingFlags flag 
= BindingFlags.Public | BindingFlags.Instance;

   object[] parameters = new object[]{"Hello"};

   object returnValue = method.Invoke(dObj,flag,Type.DefaultBinder,parameters,null);

4. 动态创建委托
    委托是C#中实现事件的基础,有时候不可避免的要动态的创建委托,实际上委托也是一种类型:System.Delegate,所有的委托都是从这个类派生的
    System.Delegate提供了一些静态方法来动态创建一个委托,比如一个委托:

namespace TestSpace {
   delegate string TestDelegate(string value);
   public class TestClass {
 public TestClass() {
         }
         public void GetValue(string value) {
             return value;
         }
    }
}
 
使用示例: 
//获取类型,实际上这里也可以直接用typeof来获取类型
Type t = Type.GetType(“TestSpace.TestClass”);
//创建代理,传入类型、创建代理的对象以及方法名称
TestDelegate method = (TestDelegate)Delegate.CreateDelegate(t,obj,”GetValue”);
String returnValue = method(“hello”);









   
   
    
  

posted on 2007-03-03 14:53  pursuedream  阅读(180)  评论(0)    收藏  举报