dotNet中的反射用法入门教程

2019-12-26 17:40:00丽君

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