.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 的成員
屬性:
?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的屬性對象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)
會動態調用類的無參構造函數創建一個對象,返回值就是創建的對象,如果類沒有無參構造函數就會報錯。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);
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140326/20140326083336172.jpg" alt="">