關於反射的初步介紹

 反射的作用:

1 可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型;

2 應用程序需要在運行時從某個特定的程序集中載入一個特定的類型,以便實現某個任務時可以用到反射;

3 反射主要應用於類庫,這些類庫需要知道一個類型的定義,以便提供更多的功能。
應用要點:
1
現實應用程序中很少有應用程序需要使用反射類型
2
使用反射動態綁定需要犧牲性能
3
有些元數據信息是不能通過反射獲取的
4
某些反射類型是專門爲那些clr 開發編譯器的開發使用的,所以你要意識到不是所有的反射類型都是適合每個人的

反射機制調用的步驟

反射相關的命名空間System.reflection,常用的類有AssemblyMemberInfoEventInfoMethodInfo ConstructorInfo PropertyInfoSystem.Type

1 加載程序集

2 獲取類的類型

3 創建該類的實例

4 調用該實例的方法

詳細見下面解說

1、加載程序集

System.Reflection.Assembly類有兩個靜態方法:

Assembly.Load(string assemblyname)

Assembly.LoadFrom(string filename)

備註:

這兩個方法把程序集加載到應用程序域中。

通常應用程序集名稱是一個不包含擴展名的文件名。例如,TestApp.exeBusinessObjectLibrary.dll的程序集名稱分別是TestAppBusinessObject

如果希望CLR根據指定的程序集名稱找到程序集,應該使用Assembly.Load()方法。但是如果該程序集被強命名(strongly named),你必須同時提供程序集名稱和公鑰(public key token),以向CLR說明你的意圖是:首先試圖從GACGlobal Assembly Cache,全局程序集緩存)加載程序集,如果失敗,繼續在應用所在目錄和私有路徑目錄中尋找並且加載程序集.

另一種加載程序集的途徑是通過Assembly.LoadFrom(string filename)。如果你希望加載的程序集超出了CLR的預定探查範圍,你可以用這種辦法直接從一個文件位置加載程序集。

  2、獲取類的類型

Type objType = assm.GetType (“TestApp.BusinessObject”);

 

System.Type與反射相關的常用方法.

GetMethod 獲取當前 Type 的特定方法。

GetMethods 獲取當前 Type 的方法。

GetProperties 獲取當前 Type 的屬性 (Property)

GetProperty 獲取當前 Type 的特定屬性 (Property)

GetInterface 獲取由當前 Type 實現或繼承的特定接口。

GetInterfaceMap返回指定接口類型的接口映射。

GetInterfaces當在派生類中重寫時,獲取由當前 Type 實現或繼承的所有接口。

GetEvent 獲取由當前 Type 聲明或繼承的特定事件。

GetEvents 獲取由當前 Type 聲明或繼承的事件。

InvokeMember 調用當前 Type 的特定成員。

備註:

它返回程序集(本例即assm)中的類類型信息。GetType()方法會重載(overload) 多次。在這個例子中,希望用指定類型名創建一個Type對象,該指定類型名採用命名空間加上類名的形式(如果此類在GAC中,你還必須提供公鑰,而版本號爲可選參數,可根據情況決定是否提供)。從代表BusinessObject類的Type實例objType中,你能得到很多有用的信息,例如objType.GetMethods()返回BusinessObject類中所有方法的信息,而objType.GetProperties()返回所有屬性的信息。

3創建類的實例

object objInstance = System.Activator.CreateInstance(objType);

4調用該實例的方法

MethodInfo miEx = objType.GetMethod("DoWork");

miEx.Invoke(objInstance, null);

備註:

最後一步是調用DoWork()方法。miEx.Invokebo.DoWork()BusinessObject bo =new BusinessObject(); bo.DoWork();)完成同樣的工作。 MethodInfo.Invoke()方法支持object[]類型的參數,它代表目標方法的輸入參數數組。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章