.NET/C#利用反射調用含ref或out參數的方法示例代碼

這篇文章主要給大家介紹了關於.NET/C#利用反射調用含ref或out參數的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨着小編來一起學習學習吧

前言

使用反射,我們可以很容易地在運行時調用一些編譯時無法確定的屬性、方法等。在.NET中的反射可以實現從對象的外部來了解對象(或程序集)內部結構的功能,哪怕你不知道這個對象(或程序集)是個什麼東西,另外.NET中的反射還可以運態創建出對象並執行它其中的方法。

反射是.NET中的重要機制,通過反射,可以在運行時獲得程序或程序集中每一個類型(包括類、結構、委託、接口和枚舉等)的成員和成員的信息。有了反射,即可對每一個類型瞭如指掌。另外我還可以直接創建對象,即使這個對象的類型在編譯時還不知道。

反射的用途:

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

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

(3)使用ConstructorInfo瞭解構造函數的名稱、參數、訪問修飾符(如pulic 或private)和實現詳細信息(如abstract或virtual)等。

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

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

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

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

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

然而,如果方法的參數中包含 ref 或 out 關鍵字的時候,又該怎麼調用呢?

本文將介紹如何反射調用含 ref 或 out 關鍵字的方法。

比如我們有這樣的類型:

public class Walterlv
{
 public string Get(string key)
 {
 }
}

那麼反射的時候可以使用:

var walterlv = new Walterlv();
var value = (string) typeof(Walterlv).GetMethod("Get").Invoke(walterlv, new object[] { "key" });

然而現在我們的函數是這樣的,帶一個 out 關鍵字的參數:

public class Walterlv
{
 public bool TryGet(string key, out string value)
 {
 }
}

事實上,無論是什麼樣的方法,在反射式調用的都是同一個方法,即 Invoke。

對於 out 和 ref 關鍵字的方法來說,會更新傳入的數組,也就是 Invoke 最後傳入的那個參數。所以其實我們只需要保存那個數組的實例,在調用完畢之後便能重新取出被修改的參數了。

var walterlv = new Walterlv();
var args = new object[] { "key", null };
var value = (string) typeof(Walterlv).GetMethod("Get").Invoke(walterlv, args);
// 在這裏可以從 args 裏面取出被 ref 或者 out 修改的參數。

參考資料

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對神馬文庫的支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章