【C#】:淺談反射機制 【轉】

來源:互聯網
上載者:User

標籤:應用   start   too   大小   開始   space   建構函式   detail   copy   

http://blog.csdn.net/lianjiangwei/article/details/47207875 

什麼是反射?

        反射提供了封裝程式集、模組和類型的對象(Type 類型)。可以使用反射動態建立類型的執行個體,將類型綁定到現有對象,或從現有對象擷取類型並調用其方法或訪問其欄位和屬性。如果代碼中使用了屬性,可以利用反射對它們進行訪問。

        反射機制是.Net中擷取運行時類型資訊的方式,.Net的應用程式由幾個部分:‘程式集(Assembly)’、‘模組(Module)’、‘類型(class)’組成,而反射提供一種編程的方式,讓程式員可以在程式運行期獲得這幾個組成部分的相關資訊。

        

        通俗的來講,就是反射是通過一個對象去瞭解另一個對象的內部結構和資訊,即使在你不知道那個對象存在的情況下。就好比是海船的聲納探測一樣,我們並不知道海水深處是什麼情況,但是通過聲呐反射回來的情況,就可以掌握障礙物的大小,移動速度等等,和我們所談論的反射是一個道理。但是我們在程式使用反射不僅可以擷取,類的內部情況,還可以操作調用反射類的方法,簡直是太神奇了。

        為什麼用反射?

        1使用了反射後,你的程式在更新的時候無需重新編譯,只要將更新的Dll換掉即可完成程式的更新和升級。

        2將反射和設定檔相結合,可以開發出功能隨意增刪改的軟體,具備了極大地靈活性和擴充性。

        3反射提高了程式的靈活性,降低了耦合性,提高了自適應能力,同時也大大提高了程式的複用性。

        但是要強調的一點是,任何事物都有兩面性,不是所有場合都適合使用反射技術的。使用反射也會有其缺點:

        1首先帶來的一個很大的問題就是——效能問題,使用反射基本上是一種解釋操作,用於欄位和方法接入時要遠慢於直接代碼。

        2使用反射會使程式內部邏輯模糊化,程式員在調試代碼的時候西瓦昂看到清晰的程式邏輯,而反射卻繞過了原始碼,因此會帶來一定的維護性問題,同時反射代碼比相應的直接代碼更加複雜。

        綜上所述:反射機制有其適用的場合,只要用來開發對靈活性和擴充性要求很高的軟體系統,普通的程式沒必要使用。

        怎麼用反射?

        首先聲明我對反射的使用不是很深入,只是做了一些簡單的嘗試,下面用一個小Demo來說明如何在C#中使用反射擷取一個類的屬性、方法以及修改屬性和調用方法等。代碼如下:

        首先我們先寫一個目標類Student     

[csharp] view plain copy
  1. <span style="font-size:18px;">using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace ITOO.Reflection.Student  
  7. {  
  8.     public class Student  
  9.     {  
  10.         public string Name { get; set; }  
  11.   
  12.         public int Age { get; set; }  
  13.   
  14.         // 預設建構函式  
  15.         public Student()  
  16.         {  
  17.             this.Age = 24;  
  18.             this.Name = "連江偉";  
  19.         }  
  20.         //帶參數的建構函式  
  21.         public Student(string name,int age)  
  22.         {  
  23.             this.Name = name;  
  24.             this.Age = age;  
  25.         }  
  26.   
  27.         public void Hello()  
  28.         {  
  29.             Console.WriteLine("我是"+Name +",我今年"+Age +"歲了!");  
  30.         }  
  31.     }  
  32. }</span>  

        然後我們在控制台應用程式中去利用反射操縱這個類 

[csharp] view plain copy
  1. <span style="font-size:18px;">using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Reflection;  
  6.   
  7. namespace ITOO.Reflection.Client  
  8. {  
  9.     class Program  
  10.     {  
  11.         static void Main(string[] args)  
  12.         {  
  13.             //動態載入DLL,這個LoadFile最方便,參數就是dll的路徑。  
  14.             var asm = Assembly.LoadFile(@"C:\Users\ljw\Desktop\學習例子\ITOO.Reflection.Test\ITOO.Reflection.Student\bin\Debug\ITOO.Reflection.Student.dll");  
  15.             //擷取Student類的類型  
  16.             var type = asm.GetType("ITOO.Reflection.Student.Student");  
  17.             //建立該類的執行個體  
  18.             var instance = asm.CreateInstance("ITOO.Reflection.Student.Student");  
  19.             //為學生類的屬性賦值  
  20.             type.GetProperty("Name").SetValue(instance, "段天涯", null);  
  21.             type.GetProperty("Age").SetValue(instance, 18, null);  
  22.             //擷取Student類的方法  
  23.             var method = type.GetMethod("Hello");  
  24.             //調用Student類的成員方法Hello  
  25.             method.Invoke(instance, null);  
  26.             Console.Read();  
  27.         }  
  28.     }  
  29. }</span>  

        小結一下:對於反射這個概念,一開始我是比較模糊的,雖然很多次的聽到別人在說在講,但是由於沒有自己去查資料去研究,去動手代碼實現,終究不能感同身受,理解其中的原理和思想,如今閱讀了大量的部落格和文章之後,又動手實踐了一下,有了一些淺淺的理解,由於Donet的反射機制是封裝好的,所以對於反射內部實現原理還不清楚,期待以後能夠繼續深入學習。

【C#】:淺談反射機制 【轉】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.