1. 程式人生 > >.NET/C# 使用反射呼叫含 ref 或 out 引數的方法

.NET/C# 使用反射呼叫含 ref 或 out 引數的方法

使用反射,我們可以很容易地在執行時呼叫一些編譯時無法確定的屬性、方法等。然而,如果方法的引數中包含 refout 關鍵字的時候,又該怎麼呼叫呢?

本文將介紹如何反射呼叫含 refout 關鍵字的方法。

比如我們有這樣的型別:

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

對於 outref 關鍵字的方法來說,會更新傳入的陣列,也就是 Invoke 最後傳入的那個引數。所以其實我們只需要儲存那個陣列的例項,在呼叫完畢之後便能重新取出被修改的引數了。

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

參考資料