您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Linq參數(shù)類(lèi)型有哪些,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
反射問(wèn)題:遠(yuǎn)離類(lèi)型安全錯(cuò)誤
至少就我自己而言,使用C#這種類(lèi)型安全語(yǔ)言時(shí),每當(dāng)按下Ctrl+Shift+B(或Shift+F6)鍵進(jìn)行編譯時(shí),會(huì)有一種輕松和放心的感覺(jué)。我知道,由于使用錯(cuò)誤的類(lèi)型而產(chǎn)生的怪異且難于調(diào)試的運(yùn)行時(shí)錯(cuò)誤,以及像“方法缺失”這種提示幾乎從未出現(xiàn)。但是使用反射時(shí),如果我不小心,就會(huì)出現(xiàn)臭名昭著的TargetInvocationException和一些NullReferenceException之類(lèi)的異常。下面正是我所遇到的:
MethodInfo method = typeof(Mock).GetMethod("PublicMethodParameters",
newType[]{ typeof(string), typeof(int) }));
如果對(duì)Mock類(lèi)應(yīng)用重構(gòu)以便重命名該方法,會(huì)發(fā)生什么情況呢?如果Linq參數(shù)類(lèi)型發(fā)生更改,會(huì)發(fā)生什么情況呢?毫無(wú)疑問(wèn),會(huì)發(fā)生運(yùn)行時(shí)異常!如果采用一個(gè)使用大量反射的插入式靈活框架,這決不是一個(gè)小問(wèn)題。由于害怕出錯(cuò)而不敢應(yīng)用重構(gòu)(或者使其代價(jià)昂貴)必然會(huì)限制您改進(jìn)設(shè)計(jì)和完善代碼的能力。那么,試著替換魔力字符串(magic strings)和松散類(lèi)型的Type數(shù)組將會(huì)如何呢?
MethodInfo info = Reflector.Method<Mock, string,
int>((x, y, z) => x.PublicMethodParameters(y, z));
通過(guò)Linq進(jìn)行強(qiáng)類(lèi)型反射
其工作原理是作為參數(shù)傳遞的λ表達(dá)式(就像前一版本.NET中的委托一樣)不一定要執(zhí)行。上面的代碼基本上構(gòu)造了一個(gè)可以調(diào)用類(lèi)型上給定方法的λ表達(dá)式。聲明方法的目標(biāo)類(lèi)型的類(lèi)型就是Method<> static generic方法的***個(gè)類(lèi)型參數(shù)。您可指定的可選Linq參數(shù)類(lèi)型將是您要調(diào)用的方法的Linq參數(shù)類(lèi)型(如果存在)。如果我想獲得無(wú)參數(shù)方法的MethodInfo,則表達(dá)式將是:
MethodInfo info = Reflector.Method<Mock>(x => x.PublicMethodNoParameters());
這比您以前見(jiàn)到的任何λ表達(dá)式都典型。在λ表達(dá)式中,如果您需要傳遞附加參數(shù),則必須將所有內(nèi)容放到括號(hào)中(上例中的x、y和z)。用于屬性和字段的類(lèi)型映射功能是相同的:
PropertyInfo property = Reflector.Property<Mock>(x => x.PublicProperty); FieldInfo field = Reflector.Field<Mock>(x => x.PublicField);
關(guān)于Linq參數(shù)類(lèi)型有哪些就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。