百度首页 | 百度空间
 
查看文章
 
c# 反射的用法
2008-05-03 23:36

c# 反射的用法
作者:徐磊
在网上查找了不少的资料,可以说大同小异,概念性的东西网上一搜一堆,
今天把反射的东西整理了一下,供大家使用,我保证我这里是最全面的东西,当然也是基础的东西,
在学好了这一切的基础上,大家可以学习反射的具体插件等应用,老鸟就不用看了.
首先我们建立一个类库,将它生成为HelloWorld.dll,
using System;

namespace Webtest
   ... {

     public   interface interface1
       ... {
           int add();
    
     }
      public   class ReflectTest:interface1
       ... {
        
          public String Write;
          private String Writec;

          public String Writea
           ... {
              get
               ... {
                  return Write;
             }
              set
               ... {
                 Write = value;
             }
        
         }

          private String Writeb
           ... {
              get
               ... {
                  return Writec;
             }
              set
               ... {
                 Writec = value;
             }

         }

           public ReflectTest()
            ... {
               this .Write =   " Write " ;
               this .Writec =   " Writec " ;
          }

          public ReflectTest( string str1, string str2)
           ... {
              this .Write = str1;
              this .Writec = str2;
         }

          public   string WriteString( string s, int b)
           ... {
              return   " 欢迎您, "   + s +   " --- "   + b; ;
         }

           public   static   string WriteName( string s)
            ... {
              return   " 欢迎您光临, "   + s;
          }

          public   string WriteNoPara()
           ... {
             return   " 您使用的是无参数方法 " ;
         }

          private   string WritePrivate()
           ... {
              return   " 私有类型的方法 " ;
         }


          public   int add()
           ... {
              return   5 ;
         }
     }
}然后,建立再建立一个项目引入该HelloWorld.dll,
using System;

using System.Threading;
using System.Reflection;


class Test
... {
     delegate   string TestDelegate( string value, int value1);

    static   void Main()
      ... {
         // Assembly t = Assembly.LoadFrom("HelloWorld.dll"); 与下面相同的效果
         Assembly t = Assembly.Load( " HelloWorld " );

// **********************************************************************     
         foreach (Type aaa in t.GetTypes())
         ... {
             // Console.Write(aaa.Name);    // 显示该dll下所有的类
         }

// **********************************************************************
         Module[] modules = t.GetModules();

         foreach (Module module in modules)
          ... {
             // Console.WriteLine("module name:" + module.Name); // 显示模块的名字本例为"HelloWorld.dll"
         }

// **********************************************************************
         Type a =   typeof (Webtest.ReflectTest); // 得到具体的类的类型,和下面一个效果
         // Type a = t.GetType("Webtest.ReflectTest"); //
         // Console.Write(a.Name);

// **********************************************************************
           string [] bb = ... { " aaaa " , " bbbbb " } ;
         object obj = Activator.CreateInstance(a,bb); // 创建该类的实例,后面的bb为有参构造函数的参数
         // object obj = t.CreateInstance("Webtest.ReflectTest"); // 与上面方法相同

// **********************************************************************        
         MethodInfo[] miArr = a.GetMethods();
         foreach (MethodInfo mi0 in miArr)
         ... {
             // Console.Write(mi0.Name);   // 显示所有的共有方法
        }

// **********************************************************************
         MethodInfo mi = a.GetMethod( " WriteString " ); // 显示具体的方法
           object [] aa = ... { " 使用的是带有参数的非静态方法 " , 2 } ;
         string s = ( string )mi.Invoke(obj,aa); // 带参数方法的调用

        MethodInfo mi1 = a.GetMethod( " WriteName " );
         String[] aa1 = ... { " 使用的是静态方法 " } ;
         string s1 = ( string )mi1.Invoke( null , aa1); // 静态方法的调用

        MethodInfo mi2 = a.GetMethod( " WriteNoPara " );
         string s2 = ( string )mi2.Invoke(obj, null ); // 不带参数的方法调用

        MethodInfo mi3 = a.GetMethod( " WritePrivate " ,BindingFlags.Instance | BindingFlags.NonPublic);
         string s3 = ( string )mi3.Invoke(obj, null ); // 私有类型方法调用

         // Console.Write(s3);

// **********************************************************************
         PropertyInfo[] piArr = a.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
         foreach (PropertyInfo pi in piArr)
          ... {
          // Console.Write(pi.Name);   // 显示所有的属性
         }

// **********************************************************************
         PropertyInfo pi1 = a.GetProperty( " Writea " );
         // pi1.SetValue(obj, "Writea", null);
         // Console.Write(pi1.GetValue(obj,null));

        PropertyInfo pi2 = a.GetProperty( " Writeb " , BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        pi2.SetValue(obj, " Writeb " , null );
         // Console.Write(pi2.GetValue(obj, null));

        FieldInfo fi1 = a.GetField( " Write " );
         // Console.Write(fi1.GetValue(obj));

// **********************************************************************
         ConstructorInfo[] ci1 = a.GetConstructors();
         foreach (ConstructorInfo ci in ci1)
          ... {
             // Console.Write(ci.ToString()); // 获得构造函数的形式
         }

         ConstructorInfo asCI = a.GetConstructor( new Type[] ... { typeof ( string ), typeof ( string ) } );
         // Console.Write(asCI.ToString());

// **********************************************************************
         Webtest.interface1 obj1 = (Webtest.interface1)t.CreateInstance( " Webtest.ReflectTest " );
        Webtest.ReflectTest obj2 = (Webtest.ReflectTest)t.CreateInstance( " Webtest.ReflectTest " );
         // Console.Write(obj1.add());典型的工厂模式

// **********************************************************************
          foreach (Type tt in t.GetTypes())
          ... {
             if (tt.GetInterface( " interface1 " ) != null )
              ... {
                Webtest.interface1 obj3 = (Webtest.interface1)Activator.CreateInstance(a);
                 // Console.Write(obj3.add());
             }
        }

// **********************************************************************
         TestDelegate method = (TestDelegate)Delegate.CreateDelegate( typeof (TestDelegate), obj, " WriteString " );
       // 动态创建委托的简单例子
         // Console.Write(method("str1", 2));

// **********************************************************************
         ConstructorInfo asCI1 = a.GetConstructor( new Type[ 0 ]);
        Webtest.ReflectTest obj5 = (Webtest.ReflectTest)asCI1.Invoke( null );
            // 通过无参构造函数实例化的方法
         // Console.Write(obj5.Writea);

         ConstructorInfo asCI2 = a.GetConstructor( new Type[] ... { typeof ( string ), typeof ( string ) } );
          // 通过有参构造函数实例化的方法
         Webtest.ReflectTest obj6 = (Webtest.ReflectTest)asCI2.Invoke(bb);
        Console.Write(obj6.Writea);
// **********************************************************************

        Console.Read();
    }   
}
在这里我把我们常用的方法,属性,等全部整理了出来,大家不要嫌弃乱,静下心来,自己按照我的分隔一部分一部分的来,保证你对反射的学习,会事半功倍.当然有关于其方法我会继续补充,想了这么些就先写下来吧.


类别:visual studio编程 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu