最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

.NET/C#利用反射調(diào)用含ref或out參數(shù)的方法示例代碼

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:34:53
文檔

.NET/C#利用反射調(diào)用含ref或out參數(shù)的方法示例代碼

.NET/C#利用反射調(diào)用含ref或out參數(shù)的方法示例代碼:前言 使用反射,我們可以很容易地在運(yùn)行時(shí)調(diào)用一些編譯時(shí)無(wú)法確定的屬性、方法等。在.NET中的反射可以實(shí)現(xiàn)從對(duì)象的外部來(lái)了解對(duì)象(或程序集)內(nèi)部結(jié)構(gòu)的功能,哪怕你不知道這個(gè)對(duì)象(或程序集)是個(gè)什么東西,另外.NET中的反射還可以運(yùn)態(tài)創(chuàng)建出對(duì)象并執(zhí)行它
推薦度:
導(dǎo)讀.NET/C#利用反射調(diào)用含ref或out參數(shù)的方法示例代碼:前言 使用反射,我們可以很容易地在運(yùn)行時(shí)調(diào)用一些編譯時(shí)無(wú)法確定的屬性、方法等。在.NET中的反射可以實(shí)現(xiàn)從對(duì)象的外部來(lái)了解對(duì)象(或程序集)內(nèi)部結(jié)構(gòu)的功能,哪怕你不知道這個(gè)對(duì)象(或程序集)是個(gè)什么東西,另外.NET中的反射還可以運(yùn)態(tài)創(chuàng)建出對(duì)象并執(zhí)行它

前言

使用反射,我們可以很容易地在運(yùn)行時(shí)調(diào)用一些編譯時(shí)無(wú)法確定的屬性、方法等。在.NET中的反射可以實(shí)現(xiàn)從對(duì)象的外部來(lái)了解對(duì)象(或程序集)內(nèi)部結(jié)構(gòu)的功能,哪怕你不知道這個(gè)對(duì)象(或程序集)是個(gè)什么東西,另外.NET中的反射還可以運(yùn)態(tài)創(chuàng)建出對(duì)象并執(zhí)行它其中的方法。

反射是.NET中的重要機(jī)制,通過(guò)反射,可以在運(yùn)行時(shí)獲得程序或程序集中每一個(gè)類型(包括類、結(jié)構(gòu)、委托、接口和枚舉等)的成員和成員的信息。有了反射,即可對(duì)每一個(gè)類型了如指掌。另外我還可以直接創(chuàng)建對(duì)象,即使這個(gè)對(duì)象的類型在編譯時(shí)還不知道。

反射的用途:

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

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

(3)使用ConstructorInfo了解構(gòu)造函數(shù)的名稱、參數(shù)、訪問(wèn)修飾符(如pulic 或private)和實(shí)現(xiàn)詳細(xì)信息(如abstract或virtual)等。

(4)使用MethodInfo了解方法的名稱、返回類型、參數(shù)、訪問(wèn)修飾符(如pulic 或private)和實(shí)現(xiàn)詳細(xì)信息(如abstract或virtual)等。

(5)使用FiedInfo了解字段的名稱、訪問(wèn)修飾符(如public或private)和實(shí)現(xiàn)詳細(xì)信息(如static)等,并獲取或設(shè)置字段值。

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

(7)使用PropertyInfo了解屬性的名稱、數(shù)據(jù)類型、聲明類型、反射類型和只讀或可寫(xiě)狀態(tài)等,獲取或設(shè)置屬性值。

(8)使用ParameterInfo了解參數(shù)的名稱、數(shù)據(jù)類型、是輸入?yún)?shù)還是輸出參數(shù),以及參數(shù)在方法簽名中的位置等。

然而,如果方法的參數(shù)中包含 ref 或 out 關(guān)鍵字的時(shí)候,又該怎么調(diào)用呢?

本文將介紹如何反射調(diào)用含 ref 或 out 關(guān)鍵字的方法。

比如我們有這樣的類型:

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

那么反射的時(shí)候可以使用:

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

然而現(xiàn)在我們的函數(shù)是這樣的,帶一個(gè) out 關(guān)鍵字的參數(shù):

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

事實(shí)上,無(wú)論是什么樣的方法,在反射式調(diào)用的都是同一個(gè)方法,即 Invoke。

對(duì)于 out 和 ref 關(guān)鍵字的方法來(lái)說(shuō),會(huì)更新傳入的數(shù)組,也就是 Invoke 最后傳入的那個(gè)參數(shù)。所以其實(shí)我們只需要保存那個(gè)數(shù)組的實(shí)例,在調(diào)用完畢之后便能重新取出被修改的參數(shù)了。

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

參考資料

  • out, ref and InvokeMember !!! - CodeProject
  • c# - How to pass a parameter as a reference with MethodInfo.Invoke - Stack Overflow
  • 總結(jié)

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    .NET/C#利用反射調(diào)用含ref或out參數(shù)的方法示例代碼

    .NET/C#利用反射調(diào)用含ref或out參數(shù)的方法示例代碼:前言 使用反射,我們可以很容易地在運(yùn)行時(shí)調(diào)用一些編譯時(shí)無(wú)法確定的屬性、方法等。在.NET中的反射可以實(shí)現(xiàn)從對(duì)象的外部來(lái)了解對(duì)象(或程序集)內(nèi)部結(jié)構(gòu)的功能,哪怕你不知道這個(gè)對(duì)象(或程序集)是個(gè)什么東西,另外.NET中的反射還可以運(yùn)態(tài)創(chuàng)建出對(duì)象并執(zhí)行它
    推薦度:
    標(biāo)簽: 的方法 out 方法的
    • 熱門(mén)焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門(mén)推薦

    專題
    Top