天天看点

c#反射入门例子

C#高级应用-反射动态调用类的成员范例代码如下:

//
   ---------------------测试类------------------
   


   


   using
    System;


   using
    System.Collections.Generic;


   using
    System.Linq;


   using
    System.Text;




   namespace
    InvokeMemberDemo

{

    
   ///
    
   <summary>
   

    
   ///
     有关用户信息的相关类

    
   ///
    
   </summary>
   


       
   class
    UserInfo

    {

        
   //
   私有字段及公有属性
   


           
   private
    
   int
    carID 
   =
    
   0
   ;

        
   public
    
   int
    CarID

        {

            
   get
    { 
   return
    carID; }

            
   set
    { carID 
   =
    value; }

        }



        
   //
   公有属性
   


           
   public
    
   string
    userName 
   =
    
   ""
   ;



        
   //
   默认构造及带参构造
   


           
   public
    UserInfo() { }

        
   public
    UserInfo(
   int
    id, 
   string
    name) 

        {

            
   this
   .carID 
   =
    id;

            
   this
   .userName 
   =
    name;

        }



        
   //
   有返回值的方法
   


           
   public
    
   string
    GetName(
   string
    name)

        {

            
   return
    name;

        }



        
   //
   无返回值的方法
   


           
   public
    
   void
    GetID()

        {

            Console.WriteLine(
   "
   carID : 
   "
   +
   this
   .carID.ToString());

        }



    }

}




   //
   --------------------测试代码-----------------
   


   


   using
    System;


   using
    System.Collections.Generic;


   using
    System.Linq;


   using
    System.Text;




   using
    System.Reflection;          
   //
   引入反射的命名空间 
   


   using
    System.Collections;                       




   namespace
    InvokeMemberDemo

{

    
   class
    Program

    {

        
   static
    
   void
    Main(
   string
   [] args)

        {

            UserInfo myUser 
   =
    
   new
    UserInfo();  
   //
   创建用户信息实例
   


               Type myType 
   =
    myUser.GetType(); 
   //
   获得创建实例的类型          
   


               
   object
   [] myparam 
   =
    
   new
    
   object
   [] { 
   610430
   , 
   "
   sa
   "
    }; 
   //
   参数列表     
   


   

            
   /*
   

             * 有关反射调用成员的方法的一些参数的相关说明

             * public object InvokeMember(

             *       string name,        要调用的构造函数、方法、属性或字段成员的名称

             *       BindingFlags invokeAttr,  由一个或多个指定搜索执行方式的 BindingFlags 组成

             *       Binder binder,      涉及选择重载方法、强制参数类型和通过反射调用成员

             *       object target,       要在其上调用指定成员的 Object

             *       object[] args        包含传递给要调用的成员的参数的数组

             * );

             * 表示被调用成员的返回值的 Object。        

             * 
   */
   

            
   #region
    备注
   

            
   /*
   

            下列 BindingFlags 筛选标志可用于【定义包含在搜索中的成员】: 



            为了获取返回值,必须指定 BindingFlags.Instance 或 BindingFlags.Static。 

            指定 BindingFlags.Public 可在搜索中包含公共成员。 

            指定 BindingFlags.NonPublic 可在搜索中包含非公共成员(

             即私有成员和受保护的成员)。 

            指定 BindingFlags.FlattenHierarchy 可包含层次结构上的静态成员。 



            下列 BindingFlags 修饰符标志可用于【更改搜索的执行方式】: 



            BindingFlags.IgnoreCase,表示忽略 name 的大小写。 

            BindingFlags.DeclaredOnly,仅搜索 Type 上声明的成员,

             而不搜索被简单继承的成员。 

             

            可以使用下列 BindingFlags 调用标志表示要【对成员采取的操作】: 



            CreateInstance,表示调用构造函数。忽略 name。对其他调用标志无效。 

            InvokeMethod,表示调用方法,而不调用构造函数或类型初始值设定项。

            对 SetField 或 SetProperty 无效。 

            GetField,表示获取字段值。对 SetField 无效。 

            SetField,表示设置字段值。对 GetField 无效。 

            GetProperty,表示获取属性。对 SetProperty 无效。 

            SetProperty 表示设置属性。对 GetProperty 无效。

            
   */
   



            
   #endregion
   





            
   #region
    调用带参构造函数创建该对象的反射实例!
   

            Console.WriteLine(
   "
   调用带参构造函数创建该对象的反射实例!
   "
   );

            
   object
    userObj 
   =
    myType.InvokeMember

                (
   null
   ,

                 BindingFlags.DeclaredOnly 
   |
   

                 BindingFlags.Public 
   |
    

                 BindingFlags.NonPublic 
   |
   

                 BindingFlags.Instance 
   |
    

                 BindingFlags.CreateInstance, 
   null
   , 
   null
   , myparam);

            Console.WriteLine(
   "
   userObj : 
   "
   +
   userObj.GetType().FullName);

            Console.WriteLine();

            
   #endregion
   



            
   #region
    设置字段值并获得该字段的值
   

            Console.WriteLine(
   "
   设置字段值并获得该字段的值 !
   "
   );

            myType.InvokeMember(

                
   "
   userName
   "
   ,

                 BindingFlags.SetField,

                 
   null
   ,

                 userObj,

                 
   new
    
   object
   [] { 
   "
   myName
   "
    });

            Console.WriteLine(
   "
   字段:userName, 设置完成!
   "
   );



            
   string
    userName 
   =
    (
   string
   )myType.InvokeMember(

                
   "
   userName
   "
   ,

                 BindingFlags.GetField,

                 
   null
   ,

                 userObj,

                 
   null
   );

            Console.WriteLine(
   "
   userName: 
   "
   +
   userName);

            Console.WriteLine();

            
   #endregion
   



            
   #region
    设置属性值并获得该属性的值
   

            Console.WriteLine(
   "
   设置属性值并获得该属性的值 !
   "
   );

            myType.InvokeMember(

                
   "
   CarID
   "
   ,

                 BindingFlags.SetProperty,

                 
   null
   ,

                 userObj,

                 
   new
    
   object
   [] {
   610430
   });

            Console.WriteLine(
   "
   属性:CarID,设置完成!
   "
   );



            
   int
    carID 
   =
    (
   int
   )myType.InvokeMember(

                
   "
   CarID
   "
   ,

                 BindingFlags.GetProperty,

                 
   null
   ,

                 userObj,

                 
   null
   );

            Console.WriteLine(
   "
   CarID: 
   "
    
   +
    carID);

            Console.WriteLine();

            
   #endregion
   



            
   #region
    调用有返回值的方法
   

            Console.WriteLine(
   "
   调用有返回值的方法 !
   "
   );

            
   string
    GetName 
   =
    (
   string
   )myType.InvokeMember(

                
   "
   GetName
   "
   ,

                BindingFlags.InvokeMethod 
   |
   

                BindingFlags.Public 
   |
   

                BindingFlags.Instance,

                
   null
   ,

                userObj,

                
   new
    
   object
   [] {
   "
   MyName
   "
   });

            Console.WriteLine(
   "
   GetName: 
   "
   +
   GetName);

            Console.WriteLine();

            
   #endregion
   



            
   #region
    调用无返回值的方法
   

            Console.WriteLine(
   "
   调用无返回值的方法 !
   "
   );

            myType.InvokeMember(

                
   "
   GetID
   "
   ,

                BindingFlags.InvokeMethod 
   |
   

                BindingFlags.Public 
   |
   

                BindingFlags.Instance,

                
   null
   ,

                userObj,

                
   null
   );

            Console.WriteLine();

            
   #endregion
   





            
   #region
    动态装载指定实例的反射数据对象并解析数据
   

            ArrayList myList 
   =
    
   new
    ArrayList();



            
   //
   装载数据对象
   


               
   for
    (
   int
    i 
   =
    
   1
   ; i 
   <
    
   11
   ; i
   ++
   )

            {

                myparam 
   =
    
   new
    
   object
   [] {i, 
   "
   name
   "
   +
   i };



                 userObj 
   =
    myType.InvokeMember

                    (
   null
   ,

                     BindingFlags.DeclaredOnly 
   |
   

                     BindingFlags.Public 
   |
   

                     BindingFlags.NonPublic 
   |
   

                     BindingFlags.Instance 
   |
   

                     BindingFlags.CreateInstance, 
   null
   , 
   null
   , myparam);

                myList.Add(userObj);

            }



            
   //
   便利数据对象
   


               
   foreach
   (
   object
    
   var
    
   in
    myList)

            {

                
   string
    userNames 
   =
    (
   string
   )myType.InvokeMember(

                 
   "
   userName
   "
   ,

                  BindingFlags.GetField,

                  
   null
   ,

                  
   var
   ,

                  
   null
   );

                Console.WriteLine(
   "
   userNames: 
   "
    
   +
    userNames);

            }

            
   #endregion
   

            Console.ReadLine();    
   //
   暂停
   


           }

    }

}