程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 理解C#中反射的有關概念與反射的應用

理解C#中反射的有關概念與反射的應用

編輯:關於C#

反射(Reflection)是.NET中的重要機制,通過放射,可以在運行時獲得.NET中每一個類型(包括類、結構、委托、接口和枚舉等)的成員,包括方法、屬性、事件,以及構造函數等。還可以獲得每個成員的名稱、限定符和參數等。有了反射,即可對每一個類型了如指掌。如果獲得了構造函數的信息,即可直接創建對象,即使這個對象的類型在編譯時還不知道。

程序代碼在編譯後生成可執行的應用,我們首先要了解這種可執行應用程序的結構。

應用程序結構分為應用程序域—程序集—模塊—類型—成員幾個層次,公共語言運行庫加載器管理應用程序域,這種管理包括將每個程序集加載到相應的應用程序域以及控制每個程序集中類型層次結構的內存布局。

程序集包含模塊,而模塊包含類型,類型又包含成員,反射則提供了封裝程序集、模塊和類型的對象。我們可以使用反射動態地創建類型的實例,將類型綁定到現有對象或從現有對象中獲取類型,然後調用類型的方法或訪問其字段和屬性。反射通常具有以下用途。

(1)使用Assembly定義和加載程序集,加載在程序集清單中列出模塊,以及從此程序集中查找類型並創建該類型的實例。

(2)使用Module了解包含模塊的程序集以及模塊中的類等,還可以獲取在模塊上定義的所有全局方法或其他特定的非全局方法。

(3)使用ConstructorInfo了解構造函數的名稱、參數、訪問修飾符(如pulic 或private)和實現詳細信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法來調用特定的構造函數。

(4)使用MethodInfo了解方法的名稱、返回類型、參數、訪問修飾符(如pulic 或private)和實現詳細信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法來調用特定的方法。

(5)使用FiedInfo了解字段的名稱、訪問修飾符(如public或private)和實現詳細信息(如static)等,並獲取或設置字段值。

(6)使用EventInfo了解事件的名稱、事件處理程序數據類型、自定義屬性、聲明類型和反射類型等,添加或移除事件處理程序。

(7)使用PropertyInfo了解屬性的名稱、數據類型、聲明類型、反射類型和只讀或可寫狀態等,獲取或設置屬性值。

(8)使用ParameterInfo了解參數的名稱、數據類型、是輸入參數還是輸出參數,以及參數在方法簽名中的位置等。

System.Reflection.Emit命名空間的類提供了一種特殊形式的反射,可以在運行時構造類型。

反射也可用於創建稱為類型浏覽器的應用程序,使用戶能夠選擇類型,然後查看有關選定類型的信息。

此外,Jscript等語言編譯器使用反射來構造符號表。System.Runtime.Serialization命名空間中的類使用反射來訪問數據並確定要永久保存的字段,System.Runtime.Remoting命名空間中的類通過序列化來間接地使用反射。

實例:

在C#中新建一個類庫CustomControls

新建類MathUtil

鍵入以下代碼

MathUtil
    public string ApplicationName
    {
      get
      {
        return "MathUtil";
      }
    }
    public double Sum(double x, double y)
    {
      return x + y;
    }

在新建一個"控制台應用程序",並將CustomControls.dll導入

在Main函數中鍵入以下代碼(這是就可以調試了享受一下反射帶來的樂趣,在總結一下反射會用在那些場合就可以了)

Code

Assembly ass = Assembly.LoadFrom(@"F:\PaipaiBa\AJAXWebSite\bin\CustomControls.dll");
    Module[] mods = ass.GetLoadedModules();
    Type t = ass.GetType("CustomControls.MathUtil");
    object obj = System.Activator.CreateInstance(t);
    Type[] paramTypes = new Type[2];
    paramTypes[0] = System.Type.GetType("System.Double");
    paramTypes[1] = System.Type.GetType("System.Double");
    MethodInfo med = t.GetMethod("Sum", paramTypes);
    object[] parameters = new object[2];
    parameters[0] = 5d;
    parameters[1] = 4d;
    object objRetval = med.Invoke(obj, parameters);

反射的作用:(Copy From Somewhere)

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

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

3.反射主要應用與類庫,這些類庫需要知道一個類型的定義,以便提供更多的功能。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved