关闭

c# 反射(三)

1577人阅读 评论(0) 收藏 举报

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:234935次
    • 积分:2906
    • 等级:
    • 排名:第12206名
    • 原创:24篇
    • 转载:102篇
    • 译文:0篇
    • 评论:95条
    文章分类
    最新评论