天天看點

C# 程式集 和 反射

.Net反射機制是在運作狀态中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動态擷取的資訊以及動态調用對象的方法的功能稱為.Net的反射機制。

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

a.在程式運作時:動态 擷取加載程式集; 動态擷取類型(如類、接口等); 動态擷取類型的成員資訊(如方法,字段,屬性等);

b.在運作時,動态建立(主要根據類名 或成員名 字元串動态建立)類型執行個體,以及 調用和 通路 這些 執行個體 成員;

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

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

    擷取程式集的方式:

       獲得目前程式域中 所有的Assembly:AppDomain.CurrentDomain.GetAssemblies()

       擷取目前 對象所在的Assembly:this.GetType().Assembly

       根據路徑加載Assembly :Assembly.LoadFrom(assPath)

2.反射- Type 類型對象

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

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

        1.通過類 獲得對應Type:Typet =typeof(Person)

        2.通過對象獲得 Type:Typet =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(object o ) :判斷 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);//擷取dObj的dogName字段值

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

4.反射-PropertyInfo屬性對象

   Property Info 類代表某個類中的一個屬性

    例:操作 對象 的屬性

   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);//擷取dObj的Name屬性值

    piN.SetValue(dObj,"小白");//設定dObj裡的Name屬性值

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[]{"小白"});   //*反射調用dObj的Smile方法

6.反射- 動态建立對象

1.objectres = Activator.CreateInstance(Typetype)

    會動态調用類的 無參構造函數 建立一個對象 ,傳回 值就是建立的對象,如果類沒有無參構造函數就會報錯 。

2.使用構造器建立 

publicclass Dog{  

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

}

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

//擷取構造器 對象(根據 參數清單的 參數類型 數組 擷取)

ConstructorInfo cotr = dType. GetConstructor (new Type[]{ typeof (string), typeof ( int )} ); object resValue = cotr.Invoke (newobject[]{" 小白 ",2}); // 調用 dObj 的 Smile 方法

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

C# 程式集 和 反射
C# 程式集 和 反射
C# 程式集 和 反射