天天看點

C#基礎系列——反射筆記

前言:使用反射也有幾年了,但是一直覺得,反這個概念很抽象,今天有時間就來總結下這個知識點。

1、為什麼需要反射:

  最初使用反射的時候,作為小菜總是不了解,既然可以通過new 一個對象的方式得到對象,然後通過對象去調用屬性和方法,那麼為什麼還需要反射去調用呢?後來使用多了發現這就是一個先綁定還是後綁定的問題,很多初使用反射的開發人員通常都會有類似這種疑慮:既然在開發時就能夠寫好代碼,幹嘛還放到運作期去做,不光繁瑣,而且效率也受影響。部落客覺得主要是适用性的問題,如果你的系統沒有那麼高的擴充性和靈活性要求,你大可不必考慮反射。但在架構設計時,很多東西都需要考慮複用性,并且在某些特定的場景下你得不到具體的類時,你就必須用到反射。部落客總結了下自己使用過的反射場景:

(1)有時不知道具體的類型,可以通過dll去得到類的對象;

(2)某些特殊方法,傳過來的是泛型類,需要通過反射處理某些特殊的業務;

(3)通用方法DataTable和List<T>的互相轉化時需要用到反射;

2、如何使用反射:

(1)反射dll得到類成員:

在一個未知的dll裡面有一個Person類

通過反射dll得到Person類

        //var assembly = Assembly.Load("Ewin.Client.Web");//參數為程式集的名稱

        //var oType = assembly.GetType("Ewin.Client.Web.Controllers." + strType);

得到結果

C#基礎系列——反射筆記

(2)反射對象的私有成員:

一般私有屬性的用法比較少,我們就以私有字段為例來說明,還是上面的例子:

C#基礎系列——反射筆記

(3)反射對象的靜态成員:

C#基礎系列——反射筆記

還有枚舉類型等等就不一一介紹了,基本上都是在BindingFlags這個上面做處理。

(4)反射得到對象以及對象的操作:

反射得到對象的方法主要有兩種

對象屬性的取值和指派: