C#知識梳理——反射
1、反射的基本信息
exe/dll文件主要區(qū)別,exe文件有入口

metadata元數(shù)據(jù)—描述exe/dll文件的數(shù)據(jù)清單 記錄了有哪些類、屬性等之類的-----通過反射(reflection)獲取元數(shù)據(jù)中的數(shù)據(jù)
【1】???? 更新程序時(更新自己的Dll)
【2】???? 使用別人的DLL文件(這種可以讀取別人的私有的內(nèi)容)
?
反射是什么?:操作metadata的一個工具(類庫,用來讀取或者操作元數(shù)據(jù)—類 方法 特性 屬性字段 )
為什么要通過反射間接去操作呢?:1、因為我們需要動態(tài),不要寫死的。2、讀取私有的內(nèi)容
使用場合:比如 asp.net MVC ---ORM---LOC---AOP 幾乎所有的框架都會使用這個反射
?
總而言之—反射,即一個工具,用來操作元數(shù)據(jù)。
2、通過反射加載DLL文件
每個項目都會生成一個dll 不管是什么方法引用dll 都最好先把所引用文件放到當(dāng)前目錄下 不然只能通過完全路徑引用了
通過反射創(chuàng)建對象
步驟:獲取dll->獲取type=>object創(chuàng)建對象->類型轉(zhuǎn)換褪去object的皮->正常使用
通過反射創(chuàng)建對象 (帶參數(shù))
其實帶參數(shù)的和不帶參數(shù)的是一樣的,區(qū)別就是一個方法的不同傳參、調(diào)用、匹配
步驟:獲取dll->獲取type=>object創(chuàng)建對象(按照參數(shù)的類型、個數(shù)、順序在Activator.CreateInstance)中寫入,其會自動匹配->類型轉(zhuǎn)換褪去object的皮->正常使用
通過反射創(chuàng)建對象(私有構(gòu)造函數(shù))
什么是私有構(gòu)造函數(shù)?à含有私有字段,不能直接實例化,因為私有構(gòu)造函數(shù)有其保護機制。
步驟:獲取dll->獲取type=>object創(chuàng)建對象(Activator.CreateInstance創(chuàng)建對象時要傳入true)中寫入,其會自動匹配->類型轉(zhuǎn)換褪去object的皮->正常使用
這個功能還用在單例模式里 (一個對象只能創(chuàng)建一次)

通過反射創(chuàng)建對象(泛型類)
步驟:獲取dll->獲取type(獲取到類名稱,根據(jù)泛型格式,利用占位符`來規(guī)范格式)=> genertype.MakeGenericType 根據(jù)泛型要求使用typeof給泛型賦類 ->object創(chuàng)建對象(Activator.CreateInstance創(chuàng)建對象時要傳入true)中寫入,其會自動匹配->類型轉(zhuǎn)換褪去object的皮->正常使用
通過反射調(diào)用方法
其實在上文已經(jīng)提到過了一種方法,即通過反射調(diào)用類型,創(chuàng)建對象,然后可以調(diào)用方法。
這是另外一種方式。
反射與MVC和AOP
MVC本質(zhì)還是通過反射起的作用
我們反射,其實是dll文件名稱+類型名稱+方法名稱=我們的方法
而MVC

看起來是不是很像MVC的結(jié)構(gòu)?其實打開這個網(wǎng)頁,也就是調(diào)用了這個方法。
反射在MVC中有缺點存在:不能通過參數(shù)匹配的方式去匹配方法!所以要在MVC中加入請求類型用以區(qū)分(像重載這種情況)

APO==是一種面前切面編程。是OOP對象技術(shù)的一種補充。
通過反射調(diào)用私有方法
前邊講到過用反射創(chuàng)建對象(私有構(gòu)造函數(shù)),通過反射調(diào)用私有方法與之還是有些區(qū)別的。
步驟:獲取dll->獲取type(獲取到類名稱)=> object創(chuàng)建對象-> MethodInfo 創(chuàng)建容器保存type。GetMethon獲得的方法類型,而在GetMethon中使用BindingFlags 與|邏輯運算符給出組合條件參數(shù)-> ??methodInfo.Invoke(obj,new object[] { xxx} );正常使用
通過反射調(diào)用泛型方法
之前講過通過反射創(chuàng)建泛型對象

普通類中泛型方法的調(diào)用---
步驟:獲取dll->獲取type(獲取到類名稱)=> object創(chuàng)建對象-> MethodInfo 創(chuàng)建容器保存type.GetMethon獲得的方法類型-> MethodInfo .MakeGenericMethod(new object[] { typeof(int), typeof(string)...... }確定方法的類型和個數(shù)–> methodInfo.Invoke(obj,new object[] { xxx} );正常使用
泛型類中泛型方法的調(diào)用—
步驟:獲取dll->獲取type(獲取到類名稱,用占位符獲取參數(shù)個數(shù))=> 獲取typenew(MakeGenericType確定泛型方法的參數(shù)類型)=> object創(chuàng)建對象-> MethodInfo 創(chuàng)建容器保存typenew.GetMethon獲得的方法類型-> MethodInfo .MakeGenericMethod(new object[] { typeof(int), typeof(string)...... }確定方法的類型和個數(shù)–> methodInfo.Invoke(obj,new object[] { xxx} );
通過反射操作字段和屬性等成員---