程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 程序集 和 反射

C# 程序集 和 反射

編輯: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(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);//獲取dObj的dogName字段值

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);//獲取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類類型 對象

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

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="">


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved