程式集載入與反射(一) 理論篇

2022-01-15 02:12:24 字數 3992 閱讀 3840

目錄

一、程式集載入

load方法:clr通過呼叫system.rreflection.assemblly類的靜態方法來顯示引導程式集。

public

static assembly load(assemblyname assemblyref);

public

static assembly load(string assemblystring);

loadfrom方法:同樣我們可以使用 遠端引導程式集。此方法首先開啟程式集,並通過 public static assemblyname getassemblyname(string assemblyfile);方法提取到程式集名稱,然後再會使用load方法引導程式集。

public

static assembly loadfrom(string path);

public

static assembly reflectiononlyload(string assemblystring);

同樣也有reflectiononlyloadfrom

public

static assembly reflectiononlyloadfrom(string path);

二、獲取型別資訊1、system.type.gettype方法

public

static type gettype(string typename);

字串必須執行的是全名,對於基元型別不能識別,識別clr型別。

2、system.type.reflectiononlygettype

public

static type reflectiononlygettype(string typename, bool throwifnotfound, bool ignorecase);

只是顯示反射上下文內容,不能夠執行**。

3、操作符typeof(),可以對型別進行晚期繫結並與早期繫結型別進行比對。

static encryption(object

o)

}

三、構造型別例項1、system.activator.createinstance

public

static

object createinstance(type type);

public static objecthandle createinstance(string assemblyname, string typename);

2、system.activator.createcominstancefrom

public

static objecthandle createcominstancefrom(string assemblyname, string typename);

程式集和型別都是字串直接指定,不過,程式集需要使用loadfrom方法來載入得到程式集,並且提取名稱作為引數傳遞。當然對於返回值我們也需要呼叫unwrap()進行具體化。

system.reflection.assembly assy= system.reflection.assembly.loadfrom(""

);system.activator.createcominstancefrom(assy.fullname,

"encryption

");

四、通過反射發現成員層次結構

因為reflection.memberinfo是成員結構層次的根,所以需要了解一下memberinfo的成員組成:

1、執行以下**,區分一下declaringtype和reflectedtype:

declaringtype:宣告方法的類;reflectedtype:當前的反射類

public

class

unittest1}}

public

sealed

class

mytype

}

tosting()方法,因為宣告它的類和當前所在的反射類是同乙個即mytype。

equal()方法,因為宣告它的類是object,但是當前反射類是mytype。

以上就是declaringtype和reflectedtype的區別。

2、bindingflags:篩選返回的成員種類

我們可以呼叫type的 getmethod、getproperty、getnestedtype各種get。我們可以組合bindingflags,來篩選我們需要的東西。

五、呼叫成員的型別

我們可以找出我們需要的東東,然後我們可以進行呼叫。呼叫屬性、方法、建構函式等等。

呼叫fieldinfo,可以獲取或者設定欄位的值;

呼叫constructorinfo,可以向構造傳遞實參,從而構造型別的乙個例項;

呼叫methodinfo,可以通過傳遞實參來呼叫方法,並返回它的返回值;

呼叫propertyinfo,可以呼叫屬性的get和set訪問其方法。

1、呼叫方法

public

object invokemember(string name, bindingflags invokeattr, binder binder, object target, object args, cultureinfo culture);

呼叫此方法可以在成員型別裡搜尋乙個匹配的型別成員,如果沒找到,丟擲異常。如果找到,就會呼叫此成員。我們可以歸納以上行為為兩個階段:繫結和呼叫。

我們呼叫乙個繫結器方法時,首先我們傳遞 目標成員 name、方法的所有引數型別 args 、指定的 bindingflags invokeattr 。

引數 name :目標成員。名字

引數 invokeattr :這些位標識的組合可以幫助我們更好的定位我們的成員 ignorecase = 1, declaredonly = 2,instance = 4,static = 8,public = 16等

引數 binder :它的型別從system.relflection.binder 抽象型別派生的,從binder派生的型別,封裝了invermember方法確定繫結型別的規則。編譯器為我們定義了system.defaultbinder 的實際型別可以為我們使用。可以幫助我們自動的型別轉換。

引數 target : 目標成員所在類的例項的乙個引用。靜態類 =null。

引數 args: 傳遞的引數。

引數 culture: 如果有自己的繫結器可以使用此引數,如果前面引數使用了system.defaultbinder,culture引數就可以省略了。

2、一次繫結,多次呼叫

我們利用type的invokemember方法可以,訪問任何成員。但是如果多次呼叫,我們就需要多次進行繫結並呼叫,比較損耗效能。我們可以使用:

程式集載入與反射筆記

assembly load 引導程式集,會從gac 應用程式基目錄 私有路徑子目錄查詢 assembly loadfrom 從路徑載入,首先會得到程式集,然後內部呼叫assembly.load assembly loadfile assembly reflectiononlyloadfrom 如果只...

程式集載入和反射

元資料表是用一系列字段表,方法表,型別定義表組成的。可以利用system.reflection命名空間中包含的型別,可以寫 來反射這些元資料表。具體的反射機制我是這樣理解的 首先應該清楚的了解到,system.reflection命名空間中的型別為程式集或模組中包含的換資料表提供了乙個物件模型 通過...

程式集載入和反射

最近一直都在看關於程式集載入和反射方面的資料,所以在這裡把我所學習到的東西記錄下來,方便自己以後複習,也給園子裡面不懂的朋友參考。net中反射在執行中過程中解析程式集中的元資料,獲得型別中的成員 包括字段 構造器 方法 屬性 事件等 資訊。把下面的類放在乙個類庫工程中,並編譯生成程式集 例如為cla...