c# 反射(三)

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值