動態載入類的原理 元資料的使用

2021-04-20 04:12:07 字數 1622 閱讀 1403

在使用.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的資訊以「元資料」的形式封裝在程式或是元件中,又提供了一系列可以獲取「元資料」的方法,所以我們可以程式執行期間來動態的訪問這些資訊。

具體的應用例子可以參看我的另一篇《動態載入類》。 

類的動態載入 2

1.通過new建立物件是靜態載入,如圖一,假如此時word類和excel類並不存在,office類是不可以通過編譯的,再假如乙個類中要對很多類進行例項化,都是通過new例項化的,那麼,但凡有乙個類出問題了,那麼整個大類就不會通過編譯。2.如圖二,我們使用的是動態載入類的方法,在編譯此類時,並不會載入...

使用echarts動態載入資料

顯示形式 1 2 3 var mychart 路徑配置 require.config 使用 require echarts echarts chart line 使用柱狀圖就載入bar模組,按需載入 function ec subtext 單位 padding 10 tooltip legend x...

python元類的使用 Python的元類如何使用

這次給大家帶來python的元類如何使用,使用python元類的注意事項有哪些,下面就是實戰案例,一起來看一下。今天我的任務就是徹底明白什麼是元類,一起看看。要搞懂元類,我們還是先從物件說起。python 一切皆物件,這句話你一定有聽說過 現在你就聽說了 乙個數字是物件,乙個字串是物件,乙個列表是物...