最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

C#知識梳理——反射

2023-08-16 11:04 作者:羞澀男孩小小明  | 我要投稿

1、反射的基本信息

exe/dll文件主要區(qū)別,exe文件有入口

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ù)的一種補充。

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} );

通過反射操作字段和屬性等成員---


C#知識梳理——反射的評論 (共 條)

分享到微博請遵守國家法律
咸宁市| 阳城县| 曲麻莱县| 荆门市| 曲阳县| 石楼县| 青浦区| 和政县| 哈巴河县| 康乐县| 吉首市| 内江市| 杭锦后旗| 玉溪市| 南开区| 奇台县| 理塘县| 益阳市| 牙克石市| 陇川县| 大田县| 齐齐哈尔市| 海原县| 牟定县| 肥乡县| 屏东市| 庆城县| 峨眉山市| 丰顺县| 新蔡县| 红河县| 赣榆县| 仁寿县| 安宁市| 武夷山市| 平邑县| 蚌埠市| 瑞金市| 江北区| 青铜峡市| 紫金县|