C# 程序集 和 反射

.Net反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲.Net的反射機制。

.Net反射機制主要提供了以下功能:

a.在程序運行時:動態 獲取加載程序集; 動態獲取類型(如類、接口等); 動態獲取類型的成員信息(如方法,字段,屬性等);

b.在運行時,動態創建(主要根據類名 或成員名 字符串動態創建類型實例,以及 調用和 訪問 這些 實例 成員;


1.反射-Assembly 程序集對象    using System.Reflection;

    Assembly 表示 某個程序集( .dll/exe )

    獲取程序集的方式:

       獲得當前程序域中 所有的AssemblyAppDomain.CurrentDomain.GetAssemblies()

       獲取當前 對象所在的Assemblythis.GetType().Assembly

       根據路徑加載AssemblyAssembly.LoadFrom(assPath)

2.反射- Type 類型對象

    Type類,程序運行時一個class對應一個Type類的對象。通過Type對象可以獲得類的所有的定義信息,比如類有哪些屬性、哪些方法等。

     獲得Type對象的方式:  1,2爲獲得單個類型對象,3,4,5 通過程序集獲取Type

        1.通過類 獲得對應TypeTypet =typeof(Person)

        2.通過對象獲得 TypeTypet =p.GetType()

        3.根據類的全名稱獲取程序集中定義的類:Type  type=Assembly.GetType("BLL.Person")

       4.獲取程序集中定義的所有的public類:Type[] types =assembly.GetExportedTypes()

       5.獲取程序集中定義的所有的類型:Type[] types =assembly.GetTypes()

  

      反射- Type 的成員

         屬性:

                •type.Assembly:獲取type所在的程序集對象
                •type.FullName:獲取type對象對應的類的全名稱
                •type.Name: 獲取type對象對應類的 名稱
                •type.IsArray:    判斷type是否爲一個數組類
                •type.IsEnum:   判斷type是否爲一個枚舉類
          方法:
                 •type.IsAssignableFrom(Type i):判斷type是否實現了接口i
                 •type.IsSubclassOf(Type father):判斷type是否繼承了father
                 •type.IsInstanceOfType(objecto):判斷o是否爲type類的實例
                  •type.GetFiled("gender"):獲取type中名爲gender的字段對象
                 •type.GetMethod("SayHi"):獲取type中名爲SayHi的方法對象
                 •type.GetProperty("Age"):獲取type中名爲Age的屬性對象

3.反射-FiledInfo字段對象

      FiledInfo類代表某個類中的一個成員字段(類的全局變量)

      例:操作對象的字段

      publicclassDog

      {

              publicstringdogName;

              publicintdogAge;

      }   

     Dog dObj =newDog(){dogName="小花",dogAge=1 };

     Type dType =dObj.GetType();

      FiledInfo fiDN =dType.GetFiled("dogName");//獲取字段對象

      string  strName =fiDN.GetValue(dObj);//獲取dObjdogName字段值

       fiDN.SetValue(dObj,"小白");//設置dObj裏的dogName字段值

4.反射-PropertyInfo屬性對象

   PropertyInfo類代表某個類中的一個屬性

    例:操作 對象 的屬性

   publicclassDog

   {

        publicstringName{get;set;}

        publicintAge{get;set;}

   }

   Dog dObj =newDog(){Name="小花",Age=1};

   Type dType =dObj.GetType();

   PropertyInfo piN=dType.GetProperty("Name");//獲取屬性對象

   string strName =piN.GetValue(dObj);//獲取dObjName屬性值

    piN.SetValue(dObj,"小白");//設置dObjName屬性值


5.反射-MethodInfo方法對象

    MethodInfo類 代表某個類中的一個方法
   

   publicclassDog

   {

        publicstringSmile(string name)

       {

             return "一隻會笑的狗:"+name;

       }

    }


    Dog  dObj =newDog();

    Type  dType =dObj.GetType();

    MethodInfo  method=dType.GetMethod("Smile");   //獲取方法對象

    object  res1 = dObj.Smile("哇哈哈~~");   //*普通調用方法

    object res2= method.Invoke(dObj,newobject[]{"小白"});   //*反射調用dObjSmile方法

6.反射- 動態創建對象

1.objectres = Activator.CreateInstance(Typetype)

    會動態調用類的無參構造函數創建一個對象,返回值就是創建的對象,如果類沒有無參構造函數就會報錯
2.使用構造器創建 

publicclass Dog{  

      public Dog(stringname,intage){//構造函數代碼... }

}

Type dType =typeof(Dog);//獲取Dog類類型 對象

//獲取構造器 對象(根據 參數列表的 參數類型 數組 獲取)

ConstructorInfocotr=dType.GetConstructor(new Type[]{typeof(string),typeof(int)} );objectresValue =cotr.Invoke(newobject[]{"小白",2});//調用dObjSmile方法


7.反射 - 調用對象私有成員

Person  p1 = new Person();

Type  type = p1.GetType();

//BindingFlags.Instance表示是實例方法,也就是不是static方法

MethodInfom Haha = type.GetMethod("Haha", BindingFlags.NonPublic | BindingFlags.Instance);

mHaha.Invoke(p1,null);





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章