专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » C#反射机制,什么是反射(2) »正文

C#反射机制,什么是反射(2)

来源: 发布时间:星期二, 2008年9月16日 浏览:375次 评论:0

书接上回 http://www.crazycoder.cn/DotNet/Article10920.html

继续反射机制的探讨

 

6、如何获取方法以及动态调用方法

 

        上面是一个简单的类,包含一个有参数的构造器,一个GetValue的方法,一个Value属性,我们可以通过方法的名称来得到方法并且调用之,如:

属性与方法的调用大同小异,大家也可以参考MSDN

//获取类型信息
Type    t   =    Type.GetType("TestSpace.TestClass");
//构造器的参数
object[]    constuctParms   =   new   object[]...{"timmy"};
//根据类型创建对象
object    dObj   =    Activator.CreateInstance(t,constuctParms);
//获取方法的信息
MethodInfo    method   =    t.GetMethod("GetValue");
//调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值
BindingFlags    flag   =    BindingFlags.Public   |    BindingFlags.Instance;
//GetValue方法的参数
object[]    parameters   =   new   object[]...{"Hello"};
//调用方法,用一个object接收返回值
object    returnValue   =    method.Invoke(dObj,flag,Type.DefaultBinder,parameters,null);

       

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

 

namespace    TestSpace   ...{
      
delegate   string    TestDelegate(string    value);
      
public   class    TestClass   ...{
public    TestClass()   ...{
                   }

                  
public   void    GetValue(string    value)   ...{
                          
return    value;
                   }

         }

}


使用示例:

TestClass    obj=  new TestClass();
//获取类型,实际上这里也可以直接用typeof来获取类型
Type    t   =    Type.GetType(“TestSpace.TestClass”);
//创建代理,传入类型、创建代理的对象以及方法名称
TestDelegate    method   =    (TestDelegate)Delegate.CreateDelegate(t,obj,”GetValue”);

String    returnValue   
=    method(“hello”);

 

 

namespace    TestSpace
...{
     
public   class    TestClass  
     
...{
          
private   string    _value;
          
public    TestClass()   
          
...{
           }

          
public    TestClass(string    value)  
          
...{
                 _value   
=    value;
           }


          
public   string    GetValue(   string    prefix    )   
          
...{
              
if(    _value==null    )
                 
return   "NULL";
              
else
                 
return    prefix+"    :   "+_value;
             }


            
public   string    Value   
            
...{
               
set   ...{_value=value;}
               
get   ...{
                    
if(    _value==null    )
                         
return   "NULL";
                    
else
                          
return    _value;
             }

          }

       }

}


 

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: