在使用.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的信息以「元數據」的形式封裝在程序或是組件中,又提供了一系列能夠獲取「元數據」的方法,因此咱們能夠程序運行期間來動態的訪問這些信息。html
如下摘自百度:http://zhidao.baidu.com/question/294391411.html
我的膚淺理解,反射實際上就是獲得程序集中的屬性和方法.
實現步驟:
1,導入using System.Reflection;
2,Assembly.Load("程序集")加載程序集,返回類型是一個Assembly
3, foreach (Type type in assembly.GetTypes())
{
string t = type.Name;
}
獲得程序集中全部類的名稱
4,Type type = assembly.GetType("程序集.類名");獲取當前類的類型
5,Activator.CreateInstance(type); 建立此類型實例
6,MethodInfo mInfo = type.GetMethod("方法名");獲取當前方法
7,mInfo.Invoke(null,方法參數);函數
本貼原文:http://ziseliuxingzh.blog.163.com/blog/static/51120863200832832311528/code