準(zhǔn)備項(xiàng)目 |
1.新建一個(gè)空的解決方案MyPRoj.sln 2.在該解決方案下,建一個(gè)控制臺(tái)項(xiàng)目P01.csproj 3.在該項(xiàng)目下,自己新建一個(gè)類MyFirstClass.cs ![]() |
查看解決方案MyProj.sln,知道本次要編譯哪個(gè)項(xiàng)目 ![]() |
查看項(xiàng)目文件P01.csproj(其實(shí)就是一個(gè)xml文檔),可以知道本次程序會(huì)編譯的類 ![]() |
類庫編譯成程序集 在bin目錄下生成*.dll或*。exe 程序集包含哪些內(nèi)容: 類型元數(shù)據(jù)【以二進(jìn)制的形式,描述代碼中定義的每一個(gè)類型和成員】 程序集元數(shù)據(jù)【程序集清單,版本號(hào),名稱等】 IL代碼【這些都被裝在exe或dll中】 資源文件【比如圖片這些】 |
說明:程序集是在硬盤上的,如果每次要用到某個(gè)類的話,都去硬盤上讀,速度會(huì)很慢, 所以VS會(huì)在程序第一次運(yùn)行的時(shí)候,將程序集加載到內(nèi)存中運(yùn)行。 程序集(*.dll,*exe) -->加載到 內(nèi)存中 就是Assembly對象 類(接口)--> 加載到內(nèi)存中就是 Assembly下的Type對象 類的成員 --> 加載到內(nèi)存 就是 Type下的相應(yīng)對象(FieldInfo,PropertyInfo,MethodInfo,EventInfo) |
什么是反射: 1.在程序運(yùn)行時(shí), 動(dòng)態(tài) 獲取 加載程序集 動(dòng)態(tài) 獲取 類型(類,接口) 動(dòng)態(tài) 獲取 類型的成員 信息(字段,屬性,方法) 2.在運(yùn)行時(shí), 動(dòng)態(tài) 創(chuàng)建類型實(shí)例,以及 調(diào)用 和訪問 這些 實(shí)例 成員 |
程序集(Assembly對象)===》類,接口(Type對象)===》類的成員(**Info) |
獲取Assembly的方式: 獲取當(dāng)前 應(yīng)用程序域中 所有的Assembly: AppDomain.CurentDomain.GetAssemblies(); 獲取當(dāng)前 對象 所在的 Assembly this.GetType().Assembly 根據(jù)路徑加載Assembly Assembly.LoadFrom(命名空間.類名) |
獲取Type對象的方式 1.通過類 獲得 對應(yīng) Type:Type t = typeof(Person) 2.通過對象 獲得 Type:Type t = p.GetType() 3.根據(jù)類的全名稱 獲取程序集中定義的類 Type type = Assembly.GetType(“命名空間.類名”) 4.獲取程序集中定義的所有的public類 Type[] types = assembly.GetExportedTypes 5.獲取程序集中定義的所有的類型 Type[] types = assembly.GetTypes() |
獲取Type的成員 屬性: type.Assembly:獲取type所在程序集對象 type.FullName:獲取type對象對應(yīng)的類的全名稱 type.Name:獲取type對象對應(yīng)類的 名稱 type.IsArray:判斷type是否為一個(gè)數(shù)組類 type.IsEnum:判斷type是否為一個(gè)枚舉類 方法: type.IsAssignableFrom(Type i):判斷type是否實(shí)現(xiàn)了接口i type.IsSubclassOf(Type father):判斷type是否繼承了father type.IsInstanceOfType(object o):判斷o是否為type類的實(shí)例 type.GetFiled(“gender“):獲取type中名為gender的字段對象 type.GetProperty(“Age”):獲取type中名為Age的屬性對象 type.GetMethod(“SayHi”):獲取type中名為SayHi的方法對象 |
static void Main(string[] args){ Dog dObj=new Dog() { dogName = "小白", dogAge = 1 }; Type dType = dObj.GetType(); //獲取字段對象 FieldInfo fieldDogName = dType.GetField("dogName"); //獲取dObj對象的dogName字段值,即dObj.dogName string strName = fieldDogName.GetValue(dObj) as string; //設(shè)置dObj里dogName字段賦值 fieldDogName.SetValue(dObj,"小黑"); Console.WriteLine(dObj.dogName); Console.ReadKey();}
反射-PropertyInfo屬性對象
static void Main(string[] args){ Dog dObj = new Dog() {Name = "小白", Age = 1}; Type dType = dObj.GetType(); //獲取屬性對象 PropertyInfo proName = dType.GetProperty("Name"); //獲取dObj對象的Name屬性,即dObj.Name string strName = proName.GetValue(dObj) as string; //設(shè)置dObj里面Name屬性值 proName.SetValue(dObj,"小黑"); Console.WriteLine(dObj.Name); Console.ReadKey();}
反射-MethodInfo方法對象
static void Main(string[] args){ Dog dObj=new Dog(); Type dType = dObj.GetType(); MethodInfo method = dType.GetMethod("Smile"); //普通調(diào)用方法 object res1 = dObj.Smile("小白"); //反射調(diào)用dObj的Smile方法,即dObj.Smile("小黑") //第一個(gè)參數(shù)是實(shí)例對象,第二個(gè)參數(shù)是方法的參數(shù)數(shù)組 object res2 = method.Invoke(dObj, new object[] {"小黑"}); Console.WriteLine(res1+" /n"+res2); Console.ReadKey();}
動(dòng)態(tài)創(chuàng)建對象
static void Main(string[] args){ //方法一:通過Activator 動(dòng)態(tài)創(chuàng)建對象 Type dType = typeof (Dog); //調(diào)用帶兩個(gè)參數(shù)的構(gòu)造函數(shù) Dog dogXB = Activator.CreateInstance(dType,new object[]{"小白",1}) as Dog; Console.WriteLine(dogXB.Name+"/t"+dogXB.Age); //方法二:使用 構(gòu)造器 動(dòng)態(tài)創(chuàng)建對象 Type dTypeXH = typeof (Dog); //獲得 帶兩個(gè)參數(shù)的 構(gòu)造函數(shù) ConstructorInfo ctor = dType.GetConstructor(new Type[] {typeof (string), typeof (int)}); //創(chuàng)建 指定構(gòu)造函數(shù) Dog dogXH = ctor.Invoke(new object[] {"小黑", 2}) as Dog; Console.WriteLine(dogXH.Name+"/t"+dogXH.Age); Console.ReadKey();}
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注