C#使用反射(Reflection)编程

2012-03-29 22:40:01|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C#|来源:唯设编程网

4、如何使用反射获取类型

        首先我们来看如何获得类型信息。

        获得类型信息有两种方法,一种是得到实例对象:这个时侯我仅仅是得到这个实例对象,得到的方式也许是一个object的引用,也许是一个接口的引用,但是我并不知道它的确切类型,我需要了解,那么就可 以通过调用System.Object上声明的方法GetType来获取实例对象的类型对象,比如在某个方法内,我需要判断传递进来的参数是否实现了某个 接口,如果实现了,则调用该接口的一个方法:

...
public  void  Process(  object  processObj  )
{
      Type  t  =  processsObj.GetType();
      if(  t.GetInterface("ITest")  !=null  )
                    ...
}
...

       另外一种获取类型的方法是通过Type.GetType以及Assembly.GetType方法,如:            

Type  t  =  Type.GetType(“System.String”);

        需要注意的是,前面我们讲到了命名空间和装配件的关系,要查找一个类,必须指定它所在的装配件,或者在已经获得的Assembly实例上面调用GetType。

        本装配件中类型可以只写类型名称,另一个例外是mscorlib.dll,这个装配件中声明的类型也可以省略装配件名称(.Net装配件编译的时候,默认都引用了mscorlib.dll,除非在编译的时候明确指定不引用它),比如:

          System.String是在mscorlib.dll中声明的,上面的Type  t  =  Type.GetType(“System.String”)是正确的

          System.Data.DataTable是在System.Data.dll中声明的,那么:Type.GetType(“System.Data.DataTable”)就只能得到空引用。

          必须:

Type  t  =  Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0,  Culture=neutral,  PublicKeyToken=b77a5c561934e089");

          这样才可以!

5、如何根据类型来动态创建对象

        System.Activator提供了方法来根据类型动态创建对象,比如创建一个DataTable:

Type t  =  Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b77a5c561934e089");

DataTable  table  =  (DataTable)Activator.CreateInstance(t);

例二:根据有参数的构造器创建对象

namespace  TestSpace
{
  public  class  TestClass
      {
      private  string  _value;
      public  TestClass(string  value)
    {
      _value=value;
      }
  }
}
…
Type  t  =  Type.GetType(“TestSpace.TestClass”);
Object[]  constructParms  =  new  object[]  {“hello”};  //构造器参数
TestClass  obj  =  (TestClass)Activator.CreateInstance(t,constructParms);
…

把参数按照顺序放入一个Object数组中即可

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

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

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

//获取类型信息
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);

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

发表评论0条 】
网友评论(共?条评论)..
C#使用反射(Reflection)编程