反射
一、程序集
1、程序集

我們所寫的所有代碼都會編譯到程序集文件中,并在運行時以Assembly對象方式加載到內存中運行。
2、程序集的組成

運行時:
程序集:*.exe,.dll—>加載到內存中就是Assembly對象
類:每個class,interface—>加載到內存中就是Type對象
類的成員:方法、字段、屬性、事件---à加載到內存中也有相應的對象
二、反射
1、 在程序運行時,動態獲取加載程序集,動態獲取類型(如類、接口等),動態獲取類的成員信息(如方法,字段,屬性等)
2、 在運行時,動態創建類型實例,以調用和訪問這些實例成員。
Demo

1 PRotected void Page_Load(object sender, EventArgs e) 2 { 3 //獲取當前運行程序(應用程序域)里的程序集,也就是程序跑起來用到的程序集。 4 //Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies(); 5 } 6 7 protected void Button1_Click(object sender, EventArgs e) 8 { 9 /**************************反射獲取類的成員***********************************/10 //獲取當前正在運行的程序集(Assembly)對象11 Assembly ass = this.GetType().Assembly;//this表示當前窗體12 //獲取程序集中dog類的類型(Type)對象13 Type tDog = ass.GetType("demo.Dog");14 //獲取dog類的name字段15 FieldInfo fInfo = tDog.GetField("name");16 //獲取方法17 MethodInfo mInfo = tDog.GetMethod("ShoutHi");18 19 /**************************反射調用類的成員***********************************/20 //根據Dog的Type對象,實例化一個Dog對象21 Dog d2 = Activator.CreateInstance(tDog) as Dog;//只能調用無參的構造函數22 //使用Dog類的name字段對象,為d2實例的name字段賦值23 fInfo.SetValue(d2, "小白");24 //使用Dog類的ShoutHi方法對象,執行d2實例的ShoutHi方法25 string strRes = mInfo.Invoke(d2, null) as string;26 27 }View Code
三、Assembly程序集對象
獲取程序集的方式:
1、獲得當前程序域中的所有Assembly:AppDomain.CurrentDomain.GetAssemblies() (如添加其他程序集,只有用到的時候才在程序域里面可以看到)
2、獲取當前對象的所在的Assembly:this.GetType().Assembly;
3、根據路徑加載Assembly:Assembly.LoadFrom(assPath)
獲取目前正在運行的程序集的物理路徑:
string strAssPath=this.GetType().Assembly.Location;
四、Type類型對象
獲取Type對象的方式:
1、 通過類獲取相應的Type:Type t=typeof(Person)
2、 通過對象獲取Type:Type t=p.GetType()
3、 根據類的全名稱,獲取程序集中定義的類
Type type=Assembly.GetType(“BLL.Person”)
4、 獲取程序集中定義的所有的puble類: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”的屬性字段 |
六、方法對象
1、獲取類中直接定義的(非繼承),實例的,公共方法
MethodInfo[] methods=o.GetMethods(BindingFlags.DeclaredOnly|BindingFlags.Instance|BingingFlags.Public);// o為對象對應的Type
2、 獲取類對象中的構造函數
ConstructorInfo[] constructors=t.GetConstructors();//t表示類獲取相應的Typeforeach(var c in constructors){ s+=c.GetParameters().Length.ToString();//獲取構造方法的參數長度}如類Person,有三個構造函數Person(){},Person(string name){..},Person(string name,int age,bool gender),如何根據反射獲取到構造函數?
//注意:Activator.CreateInstance(o) 只能調用無參的構造函數
Type t=typeof(Person);ConstructorInfo constructor=null; Person p=null;
//根據無參的構造函數獲取對象:
constructor=t.GetConstructor(null);p= constructor.Invoke(null) as Person;
//通過三個參數的構造方法獲取對象
constructor=t.GetConstructor(new Types[3]{typeof(string),typeof(int),typeof(bool)});p= constructor.Invoke(new object[3]{“小王”,1,true}) as Person;------------------------------------------------------------------------------------------------------------------------------------------
軟謀在線教育,最適合大學生、上班族的在線軟件培訓,主要教授asp.net動態網站制作,yy教育房間遠程實時授課,每節課錄制成高清視頻課后分享,老師白天八小時全職在線輔導,不懂就問。加QQ群:138800420 即可免費試聽。

新聞熱點
疑難解答