準備項目 |
1.新建一個空的解決方案MyPRoj.sln 2.在該解決方案下,建一個控制臺項目P01.csproj 3.在該項目下,自己新建一個類MyFirstClass.cs ![]() |
查看解決方案MyProj.sln,知道本次要編譯哪個項目 ![]() |
查看項目文件P01.csproj(其實就是一個xml文檔),可以知道本次程序會編譯的類 ![]() |
類庫編譯成程序集 在bin目錄下生成*.dll或*。exe 程序集包含哪些內容: 類型元數據【以二進制的形式,描述代碼中定義的每一個類型和成員】 程序集元數據【程序集清單,版本號,名稱等】 IL代碼【這些都被裝在exe或dll中】 資源文件【比如圖片這些】 |
說明:程序集是在硬盤上的,如果每次要用到某個類的話,都去硬盤上讀,速度會很慢, 所以VS會在程序第一次運行的時候,將程序集加載到內存中運行。 程序集(*.dll,*exe) -->加載到 內存中 就是Assembly對象 類(接口)--> 加載到內存中就是 Assembly下的Type對象 類的成員 --> 加載到內存 就是 Type下的相應對象(FieldInfo,PropertyInfo,MethodInfo,EventInfo) |
什么是反射: 1.在程序運行時, 動態 獲取 加載程序集 動態 獲取 類型(類,接口) 動態 獲取 類型的成員 信息(字段,屬性,方法) 2.在運行時, 動態 創建類型實例,以及 調用 和訪問 這些 實例 成員 |
程序集(Assembly對象)===》類,接口(Type對象)===》類的成員(**Info) |
獲取Assembly的方式: 獲取當前 應用程序域中 所有的Assembly: AppDomain.CurentDomain.GetAssemblies(); 獲取當前 對象 所在的 Assembly this.GetType().Assembly 根據路徑加載Assembly Assembly.LoadFrom(命名空間.類名) |
獲取Type對象的方式 1.通過類 獲得 對應 Type:Type t = typeof(Person) 2.通過對象 獲得 Type:Type t = p.GetType() 3.根據類的全名稱 獲取程序集中定義的類 Type type = Assembly.GetType(“命名空間.類名”) 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(object o):判斷o是否為type類的實例 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; //設置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; //設置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"); //普通調用方法 object res1 = dObj.Smile("小白"); //反射調用dObj的Smile方法,即dObj.Smile("小黑") //第一個參數是實例對象,第二個參數是方法的參數數組 object res2 = method.Invoke(dObj, new object[] {"小黑"}); Console.WriteLine(res1+" /n"+res2); Console.ReadKey();}
動態創建對象
static void Main(string[] args){ //方法一:通過Activator 動態創建對象 Type dType = typeof (Dog); //調用帶兩個參數的構造函數 Dog dogXB = Activator.CreateInstance(dType,new object[]{"小白",1}) as Dog; Console.WriteLine(dogXB.Name+"/t"+dogXB.Age); //方法二:使用 構造器 動態創建對象 Type dTypeXH = typeof (Dog); //獲得 帶兩個參數的 構造函數 ConstructorInfo ctor = dType.GetConstructor(new Type[] {typeof (string), typeof (int)}); //創建 指定構造函數 Dog dogXH = ctor.Invoke(new object[] {"小黑", 2}) as Dog; Console.WriteLine(dogXH.Name+"/t"+dogXH.Age); Console.ReadKey();}
新聞熱點
疑難解答