動態加載類的原理——元數據的使用
2024-07-21 02:22:53
供稿:網友
在使用.net創建的程序或組件時,元數據(metadata)和代碼(code)都存儲于“自成一體”的單元中,這個單元稱為裝配件。我們可以在程序運行期間訪問這些信息。
在system.reflection中有這樣一個class————assembly,我們可以通過它來加載一個裝配件。方法如下:
assembly assm=assembly.loadfrom(filename);
其中filename是要加載的裝配件的文件名稱(帶路徑)。
接下來,我們就可以通過使用system.reflection內提供的info classes來獲取裝配件中的信息了。首先讓我們看一下這些info classes:
methodinfo 獲取某個“成員函數”的信息,并提供對此“成員函數”元數據的訪問。
parameterinfo 獲取某個“參數”的信息,并提供對此“參數”元數據的訪問。
constructorinfo 獲取某個“構造函數”的信息,并提供對此“構造函數”元數據的訪問。
propertyinfo 獲取某個“屬性”的信息,并提供對此“屬性”元數據的訪問。
fieldinfo 獲取某個“數據成員”的信息,并提供對此“數據成員”元數據的訪問。
eventinfo 獲取某個“事件”的信息,并提供對此“事件”元數據的訪問。
上面列出的這些classes(除parameterinfo外)的訪問操作,要通過一個type對象來完成。比如我們要獲得一個裝配件的“成員函數”就要這樣做:
system.reflection.assembly ass=system.reflection.assembly.loadfrom(filename);
type[] tp=ass.gettypes();
system.reflection.methodinfo[] mi=tp[0].getmethods();
使用同樣的方法我們還可以得到其它的信息,如下:
獲得“構造函數”信息:system.reflection.constructorinfo[] ci=tp[0].getconstructors();
獲得“屬性”信息:system.reflection.propertyinfo[] pi=tp[0].getproperties();
獲得“數據成員”信息:system.reflection.fieldinfo[] fi=tp[0].getfields();
獲得“事件”信息:system.reflection.eventinfo[] ei=tp[0].getevents();
此外,我們可以通過parameterinfo類來獲取“成員函數”和“構造函數”的參數信息,如下:
獲取“成員函數”的參數信息:system.reflection.parameterinfo[] pi=mi[0].getparameters();
獲取“構造函數”的參數信息:system.reflection.parameterinfo[] pi=ci[0].getparameters();
parameterinfo類有兩個重要的屬性:name和parametertype。通過它們我們可以得到“參數”的名稱和數據類型。
由于.net將class的信息以“元數據”的形式封裝在程序或是組件中,又提供了一系列可以獲取“元數據”的方法,所以我們可以程序運行期間來動態的訪問這些信息。
具體的應用例子可以參看我的另一篇《動態加載類》。