c# 反射(三)

转载 2007年09月18日 13:58:00

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;
            }

         }

      }

}



C#中使用反射的优缺点

优点:             反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类;   缺点:            1、性能问题:使...
  • SpringFileld
  • SpringFileld
  • 2014年01月01日 12:30
  • 3463

理解C#反射机制

反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。...
  • xiaouncle
  • xiaouncle
  • 2016年11月01日 13:12
  • 1836

C#反射,特性结合使用

using System; using System.Reflection; using System.Collections.Generic; using System.Linq; using Sy...
  • ljm_lijingming
  • ljm_lijingming
  • 2016年04月23日 16:49
  • 264

C# 反射性能比较

自己用,保存下来
  • zhaobao110
  • zhaobao110
  • 2015年11月19日 18:06
  • 709

C#中的反射原理

原理其实很简单,.net所编写的程序集包含两个重要部分:IL(中间语言代码) 和metadata(元数据)。我们编写的代码中不是有很多很多的类吗,类有很多很多的成员,在编译代码的时候,元数据表就根据...
  • u014800094
  • u014800094
  • 2016年10月03日 15:24
  • 1786

C#中几种反射机制的比较

1. 前言         反射是一项很有趣的技术,她提供了另一个视角来模糊、统一地看待我们用代码搭建起来的小世界。由于之前工作的关系,小鱼酱曾用C++初略地实现过一套反射系统,用来支持游戏中属...
  • llgood806
  • llgood806
  • 2015年02月20日 22:02
  • 647

【C#】:浅谈反射机制

什么是反射?         反射提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代...
  • u010929604
  • u010929604
  • 2015年08月06日 08:35
  • 5267

C# 入门(19) 反射(reflection)和特性(attribute)

C#的反射和特性
  • l773575310
  • l773575310
  • 2017年05月04日 10:59
  • 401

C#反射解析数据内容,调用方法

主要是分享C#中的一些处理方法: 1.反射获取成员值 2.反射获取未知类型成员内容 3.反射获取成员工具类 这部分主要是为了拿到实例的时候我们可能不清楚实例或成员的类型,但知道起成员的名称或需要拿到其...
  • Stephanie_1
  • Stephanie_1
  • 2017年03月29日 21:07
  • 486

C# 反射-通过继承接口实现创建对象并调用方法

初学反射,在个人理解中,他的主要目的是为了让系统实现可扩展 可配置。 反射+配置文件+工厂 为例 先来一个接口类 public interface IShowFun { vo...
  • lzlawy1314
  • lzlawy1314
  • 2016年12月26日 10:31
  • 310
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c# 反射(三)
举报原因:
原因补充:

(最多只允许输入30个字)