C 反射例項

2022-02-07 22:49:25 字數 2019 閱讀 5331

c#反射的入門學習首先要明白c#反射提供了封裝程式集、模組和型別的物件等等。那麼這樣可以使用反射動態建立型別的例項,將型別繫結到現有物件,或從現有物件獲取型別並呼叫其方法或訪問其字段和屬性。如果**中使用了屬性,可以利用反射對它們進行訪問。

msdn描述:

反射通常具有以下用途:

使用 assembly 定義和引導程式集,載入在程式集清單中列出的模組,以及從此程式集中查詢型別並建立該型別的例項。

使用 module 發現以下資訊:包含模組的程式集以及模組中的類等。您還可以獲取在模組上定義的所有全域性方法或其他特定的非全域性方法。

使用 constructorinfo 發現以下資訊:建構函式的名稱、引數、訪問修飾符(如 public 或 private)和實現詳細資訊(如 abstract 或 virtual)等。使用 type 的 getconstructors 或 getconstructor 方法來呼叫特定的建構函式。

使用 methodinfo 發現以下資訊:方法的名稱、返回型別、引數、訪問修飾符(如 public 或 private)和實現詳細資訊(如 abstract 或 virtual)等。使用 type 的 getmethods 或 getmethod 方法來呼叫特定的方法。

使用 fieldinfo 發現以下資訊:欄位的名稱、訪問修飾符(如 public 或 private)和實現詳細資訊(如 static)等;並獲取或設定字段值。

使用 eventinfo 發現以下資訊:事件的名稱、事件處理程式資料型別、自定義屬性、宣告型別和反射型別等;並新增或移除事件處理程式。

使用 propertyinfo 發現以下資訊:屬性的名稱、資料型別、宣告型別、反射型別和唯讀或可寫狀態等;並獲取或設定屬性值。

使用 parameterinfo 發現以下資訊:引數的名稱、資料型別、引數是輸入引數還是輸出引數,以及引數在方法簽名中的位置等。

當您在乙個應用程式域的僅反射上下文中工作時,請使用 customattributedata 來了解有關自定義屬性的資訊。使用 customattributedata,您不必建立屬性的例項就可以檢查它們。

system.reflection.emit 命名空間的類提供了一種特殊形式的反射,使您能夠在執行時生成型別。

反射也可用於建立稱作型別瀏覽器的應用程式,它使使用者能夠選擇型別,然後檢視有關選定型別的資訊。

反射還有其他一些用途。jscript 等語言編譯器使用反射來構造符號表。system.runtime.serialization 命名空間中的類使用反射來訪問資料並確定要持久儲存的字段。system.runtime.remoting 命名空間中的類通過序列化來間接地使用反射。

乙個最簡單的c#反射例項,首先編寫類庫如下:

使用命令列編譯csc /t:library reflecttest.cs命令進行編譯,生成reflecttest.dll庫檔案。

然後進行下列程式的編寫:

c#反射學習時幾點注意內容:

1.指定類庫檔案必須使用絕對路徑,不能使用相對路徑(其實感覺有點不合理,不太方便)

2.19行,命名空間和類的名字必須一起指定

3.在例子1種必須例項化反射要反射的類,因為要使用的方法並不是靜態方法。

4.由於這個方法有兩個引數,可以用這種object的方法指定引數也可以直接寫method.invoke(obj, new object );

5.在例子2種我們想用的方法是乙個靜態方法,這時候invoke的時候,對於第乙個引數是無視的,也就是我們寫什麼都不會被呼叫,即使我們隨便new了乙個any這樣的object,當然這種寫法是不推薦的。但是對應在例子1種我們如果invoke的時候用了型別不一致的例項來做為引數的話,將會導致乙個執行時的錯誤。

6.第三個例子是乙個呼叫無引數靜態方法的例子,這時候兩個引數我們都不需要指定,用null就可以了。

再說乙個問題,如果呼叫的類是靜態類的時候,需要注意乙個問題,肯定我們會想到乙個問題,靜態類是不能例項化的,這時候,31行的類的例項化的方法我們就不需要了,直接使用invoke就可以實現,否則將會出現執行時的錯誤,同樣的道理,第乙個引數將會被無視,只要我們傳對了引數就可以了。

C 反射例項

1 建立用於反射使用的dll 新建乙個c 類庫專案,拷貝源 如下,編譯生成dll 假如dll的檔名是testreflect.dll using system using system.collections.generic using system.text namespace webtest pu...

C 反射例項講解

1 建立用於反射使用的dll 新建乙個c 類庫專案,拷貝源 如下,編譯生成dll 假如dll的檔名是testreflect.dll 1using system 23namespace webtest412 13 public string writestring string s 14 1718 1...

C 反射例項講解

1 建立用於反射使用的dll 新建乙個c 類庫專案,拷貝源 如下,編譯生成dll 假如dll的檔名是testreflect.dll using system namespace webtest public string writestring string s dsajkjflasjdfalksd...