論.NET反射、委托技術與設計模式關系之一

字號:

反射技術與設計模式
    反射(Reflection)是.net中的重要機制,通過放射,可以在運行時獲得.NET中每一個類型(包括類、結構、委托、接口和枚舉等)的成員,包括方法、屬性、事件,以及構造函數(shù)等。還可以獲得每個成員的名稱、限定符和參數(shù)等。有了反射,即可對每一個類型了如指掌。如果獲得了構造函數(shù)的信息,即可直接創(chuàng)建對象,即使這個對象的類型在編譯時還不知道。
    1、.NET可執(zhí)行應用程序結構
    程序代碼在編譯后生成可執(zhí)行的應用,我們首先要了解這種可執(zhí)行應用程序的結構。
    應用程序結構分為應用程序域—程序集—模塊—類型—成員幾個層次,公共語言運行庫加載器管理應用程序域,這種管理包括將每個程序集加載到相應的應用程序域以及控制每個程序集中類型層次結構的內存布局。
    程序集包含模塊,而模塊包含類型,類型又包含成員,反射則提供了封裝程序集、模塊和類型的對象。我們可以使用反射動態(tài)地創(chuàng)建類型的實例,將類型綁定到現(xiàn)有對象或從現(xiàn)有對象中獲取類型,然后調用類型的方法或訪問其字段和屬性。反射通常具有以下用途。
    (1)使用Assembly定義和加載程序集,加載在程序集清單中列出模塊,以及從此程序集中查找類型并創(chuàng)建該類型的實例。
    (2)使用Module了解包含模塊的程序集以及模塊中的類等,還可以獲取在模塊上定義的所有全局方法或其他特定的非全局方法。
    (3)使用ConstructorInfo了解構造函數(shù)的名稱、參數(shù)、訪問修飾符(如pulic 或private)和實現(xiàn)詳細信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法來調用特定的構造函數(shù)。
    (4)使用MethodInfo了解方法的名稱、返回類型、參數(shù)、訪問修飾符(如pulic 或private)和實現(xiàn)詳細信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法來調用特定的方法。
    (5)使用FiedInfo了解字段的名稱、訪問修飾符(如public或private)和實現(xiàn)詳細信息(如static)等,并獲取或設置字段值。
    (6)使用EventInfo了解事件的名稱、事件處理程序數(shù)據(jù)類型、自定義屬性、聲明類型和反射類型等,添加或移除事件處理程序。
    (7)使用PropertyInfo了解屬性的名稱、數(shù)據(jù)類型、聲明類型、反射類型和只讀或可寫狀態(tài)等,獲取或設置屬性值。
    (8)使用ParameterInfo了解參數(shù)的名稱、數(shù)據(jù)類型、是輸入參數(shù)還是輸出參數(shù),以及參數(shù)在方法簽名中的位置等。
    System.Reflection.Emit命名空間的類提供了一種特殊形式的反射,可以在運行時構造類型。
    反射也可用于創(chuàng)建稱為類型瀏覽器的應用程序,使用戶能夠選擇類型,然后查看有關選定類型的信息。
    此外,Jscript等語言編譯器使用反射來構造符號表。System.Runtime.Serialization命名空間中的類使用反射來訪問數(shù)據(jù)并確定要永久保存的字段,System.Runtime.Remoting命名空間中的類通過序列化來間接地使用反射。
    2、反射技術示例
    下面是反射技術的示例,我們可以在程序去得時動態(tài)實例化對象,獲得對象的屬性,并調用對象的方法。
    1Namespace ReflectionExample
    2{
    3 class Class1
    4 {
    5 [STAThread]
    6 static void Main (string [ ] args)
    7 {
    8  System.Console.WriteLine(“列出程序集中的所有類型”);
    9  Assembly a = Assembly.LoadFrom (“ReflectionExample.exe”);
    10  Type[ ] mytypes = a.GetTypes( );
    11
    12  Foreach (Type t in mytypes)
    13  {
    14   System.Console.WriteLine ( t.Name );
    15  }