反射和晚期繫結

2021-07-10 12:38:59 字數 2151 閱讀 2804

1.使用元資料完整的描述型別(介面、類、結構、委託、列舉)的能力是.net平台的乙個關鍵要素。

2.反射:是乙個執行庫型別發現的過程

通過反射可以得到乙個給定的*.dll獲取*.exe程式集所包含的所有型別的列表,這個列表包含給定型別定義的方法、字段、屬性和事件。主要在system.reflection命名空間。

3.system.type類

system.type類定義了很多成員,可以用來檢查某個型別的元資料,他們返回的型別大多位於system.reflection命名空間中。

system.type主要成員

isabstract、isclass、isvaluetype、issealed、isinte***ce.....這些屬性,可以用來發現型別的一些基本資訊

getevents()、getfields()、getinte***ce()、getmembers()、getmethods()、getproperties() ...這些方法獲取型別的

相關的資訊陣列,每個方法都有單獨的版本,通過指定引數獲取指定的項

findmembers()  該方法查詢返回乙個memberinfo型別的陣列

gettype()  該靜態方法返回乙個type例項

invokemember()  該方法執行對給定專案的晚期繫結

4.system.reflection命名空間主要成員

assembly : 該抽象類包含了許多靜態方法,通過它可以載入、了解和操作乙個程式集。

assemblyname:該類可以找到隱藏在程式集的身份中的細節

eventinfo:該抽象類儲存給定事件的資訊

fieldinfo:該抽象類儲存給定欄位的資訊

memberinfo:抽象基類,它為eventinfo、fieldinfo、methodinfo和propertyinfo型別定義了公共的行為。

methodinfo:該抽象類包含給定的方法的資訊

module:該抽象類可以使你訪問多檔案程式集中的給定模組

parameterinfo:該類儲存給定引數的資訊

propertyinfo:該抽象類儲存給定屬性的資訊

5.得到type引用

private void func1()

6.反射方法

public void listmetheds(type type)

}使用linq查詢型別中的方法:

public void listmetheds2(type type)

}7.反射字段、屬性、實現的介面

var fields = from a in type.getfields() select a;

var props = from a in type.getproperties() select a;

var inte***ces = from a in type.getinte***ces() select a;

8.type.gettype()反射泛型型別

如果呼叫type.gettype()來獲取泛型型別的元資料描述,就必須使用「反鉤號」加上數字值的語法來表示型別支援的型別引數個數。

如希望反射system.collections.generic.list元資料描述,需要傳入一下字串

system.collections.generic.list`1

9.反射方法引數和返回值

public void listmetheds2(type type)

}10.動態引導程式集

system.reflection定義了assembly的類,使用這個類,我們可以動態引導程式集,並獲取程式集內部的資訊。

assembly的靜態方法load()僅傳入乙個要載入到記憶體的程式集的友好名稱,但是需要將程式集複製到當前應用程式的相同目錄。

assembly的靜態方法loadfrom()傳入乙個要檢視的程式集的絕對路徑(更常用)。

11.晚期繫結

晚期繫結是一種建立給定型別的例項並在執行是呼叫其成員,而不需要在編譯時知道它存在的一種技術。晚期繫結對於程式的可擴充套件性來說至關重要。

12.system.activator類

該類是.net晚期繫結過程中的關鍵所在。

activator.createinstance()該方法建立乙個晚期繫結型別的例項,有多個過載版本。 }

catch (exception ex)

}

繫結方法與非繫結方法,反射,內建方法

類中定義函式分為了兩大類 1.繫結方法 特殊之處 繫結給誰就應該由誰來呼叫,誰來呼叫就會將誰當作第乙個引數自動傳入 繫結給物件的方法 在類中定義函式沒有被任何裝飾器的情況下,預設就是繫結物件的 繫結給類的方法 為類中定義函式新增乙個裝飾器class method,就是繫結類的 2.非繫結方法 特殊之...

C 利用反射動態繫結事件

大多數時都是強型別,直接繫結事件,但這種耦合關係太強,在動態呼叫dll的時候就不太合適了。以下是動態繫結和直接繫結的乙個簡單例項 1 using system 2using system.collections.generic 3using system.linq 4using system.tex...

反射簡介 C 特性和反射

net編譯器的任務之一就是為所有定義和引用的型別生成元資料描述。除了程式集中標準的元資料外,net平台還支援特定 attribute 把更多的元資料嵌入到程式集中。net特性擴充套件了抽象的system.attribute基類,net中有很多預定義的特性,例如 dllimport obsolete ...