C# System.Reflection

pamxy發表於2013-11-09

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