動態載入類的原理——中繼資料的使用

來源:互聯網
上載者:User
動態|載入|資料 在使用.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的資訊以“中繼資料”的形式封裝在程式或是組件中,又提供了一系列可以擷取“中繼資料”的方法,所以我們可以程式運行期間來動態訪問這些資訊。

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


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。