轉自:http://ziseliuxingzh.blog.163.com/blog/static/51120863200832832311528/
在使用.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的資訊以“後設資料”的形式封裝在程式或是元件中,又提供了一系列可以獲取“後設資料”的方法,所以我們可以程式執行期間來動態的訪問這些資訊。