.Net反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲.Net的反射機制。
.Net反射機制主要提供了以下功能:a.在程序運行時:動態 獲取加載程序集; 動態獲取類型(如類、接口等); 動態獲取類型的成員信息(如方法,字段,屬性等);
b.在運行時,動態創建(主要根據類名 或成員名 字符串動態創建)類型實例,以及 調用和 訪問 這些 實例 成員;
1.反射-Assembly 程序集對象 using System.Reflection;
獲得當前程序域中 所有的Assembly:AppDomain.CurrentDomain.GetAssemblies()
獲取當前 對象所在的Assembly:this.GetType().Assembly
根據路徑加載Assembly :Assembly.LoadFrom(assPath)
2.反射- Type 類型對象
Type類,程序運行時一個class對應一個Type類的對象。通過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 的成員
屬性:
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屬性對象
例:操作 對象 的屬性
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方法對象
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類類型 對象
//獲取構造器 對象(根據 參數列表的 參數類型 數組 獲取)
ConstructorInfocotr=dType.GetConstructor(new Type[]{typeof(string),typeof(int)} );objectresValue =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);