C# 反射的用法

本文出处:http://www.tzwhx.com/newOperate/html/1/12/122/12455.html

 

在网上查找了不少的资料,可以说大同小异,概念性的东西网上一搜一堆,
今天把反射的东西整理了一下,供大家使用,我保证我这里是最全面的东西,当然也是基础的东西,
在学好了这一切的基础上,大家可以学习反射的具体插件等应用,老鸟就不用看了.
首先我们建立一个类库,将它生成为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();
    }
   
}


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值