使用擴充套件方法對呼叫進行驗證

2021-09-17 19:10:27 字數 1748 閱讀 1825

利用c# 3.0提供的擴充套件方法技術,可以為已經編譯好的程式集型別增加新的方法,從而應對新的擴充套件。除了在可擴充套件性方面所具有的優勢之外,如果能夠合理地結合泛型與型別推斷,擴充套件方法還可以有效降低**的重複,提高程式的可重用性。例如,這樣的方法實現:

\public class customerdal\\}

\呼叫如下方法,可能丟擲nullreferenceexception異常:

\customer customer = new customerdal().findcustomers(role.admin).first();

\我們需要對返回結果進行驗證,如果返回為null,則可以拋出自定義異常,或者建立乙個空物件,例如:

\public ienumerable findcustomers(string rolename) \

\    return customers; \}

\如果系統有許多方法都需要對返回結果進行驗證,則這樣的驗證邏輯就會充斥在各個方法體中,既不利於重用,也會對未來的修改造成極大的阻礙。當然,我們可以引入null object模式來替代對null值的判斷邏輯,但這種方式仍然需要為多種型別定義不同的null object型別。

nullreferenceexception異常會丟擲,但是我們希望有更具體的異常資訊。因此,我們編寫了如下的擴充套件方法: \

public static t orthrow(this t obj, exception e)  

\    return obj;

\}\

\

利用orthrow擴充套件方法,則之前的呼叫方式可以修改為:

\ customer customer = new customerdal().findcustomers(role.admin).orthrow(new myexception(\"can't find customer\")).first();

\ craig andera提出: 

\

\

orthrow擴充套件方法對於你所要呼叫的型別而言是通用的,並且它返回了該型別,所以你可以將其插入到表示式鏈中,而不會丟失智慧型感應功能。並且因為型別推斷功能,實際上並不需要指定具體的型別。

\

\

也就是說,orthrow擴充套件方法可以應用到任何型別上,因此它可以在各種型別上重用非空驗證甚至是呼叫驗證。借鑑這一思想,我們還可以利用此方法預設實現物件例項的建立,以避免丟擲nullreferenceexception異常,例如:

\public static t instance(this t obj) where t:new()\\

return obj;\}\

由於instance擴充套件方法中的型別引數t需要建立例項,因此必須新增new()約束。所以該擴充套件方法存在一定的侷限,例如無法應用在之前的ienumerable型別上。但對於如下的方法卻非常有效:

public class listobject\\}

\ 通過instance擴充套件方法,可以安全地呼叫list的相關屬性和方法,例如count屬性:

\console.writeline(new listobject().foo().instance().count);

\ 控制台列印出來的結果為0。如果沒有instance擴充套件方法,則會丟擲nullreferenceexception異常。

\ 作為c# 3.0增加的新特性,擴充套件方法在大量專案中得到了廣泛地應用,但絕不僅僅是提高可擴充套件性這麼簡單。在進行專案開發時,若能適當地考慮使用擴充套件方法,說不定會帶來出奇制勝的效果。

esayui 擴充套件驗證方法,控制項驗證

頁面呼叫方法 extend fn.validatebox.defaults.rules,var rex2 0 d d d if rex.test value rex2.test value else message 請輸入正確 或手機格式 maxlength message 最大長度為字元 minl...

提交呼叫驗證 乾貨丨使用RPA進行驗證碼識別

驗證碼 驗證碼,是rpa流程自動化中經常碰到的問題。比如進行網頁或者客戶端登入的時候,或者提交資料查驗都有可能碰到驗證碼。而驗證碼的型別也是各式各樣 純數字 英文數字 英數漢等 且一般驗證碼上面都有干擾因素存在 干擾線 噪點 偏移等 通常ocr的識別效率並不是很理想,甚至真人用眼看的時候偶爾都會識別...

init 方法呼叫及擴充套件

我們在開發的過程中避免不了和系統的一些函式 方法 打交道 但是我們應該考慮乙個問題 這些方法是什麼時候呼叫的 呼叫順序是什麼 我們不能僅僅的限於使用這些方法 應該深入地了解這些方法的原理是什麼 舉個簡單的例子 instancetype init return self instancetype in...