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