本篇是對工作中遇到的擴充套件方法的總結,好記性不如亂筆頭,先記下來,以後遇到類似問題,如果忘了,可以看下部落格。
在專案中遇到乙個問題,就是要將左邊的**替換為右邊的**,右邊**是對左邊**的封裝,所以右邊的**更簡便些。
datareader.isdbnull(2) ? (string)null : datareader.getstring(2).trim();
datareader.mygetdatastring(2);
datareader的型別是system.data.sqlclient.sqldatareader
,這個是framework類庫裡面的
而mygetdatastring是專案中自定義的方法,按照現有的知識,datareader.mygetdatastring(2)這行code在編譯時,會報找不到定義才對,
那麼這裡是怎麼呼叫到了這個mygetdatastring方法的呢????
帶著這個問題,我們首先來看看這個方法在哪定義的
mygetdatastring方法定義在myproject.common.extensions.datareaderextensions 類中
public static string mygetdatastring(this idatarecord datarecorder, int index)
這個方法有什麼特別的呢???
通過觀察,我們發現引數列表裡面多加了乙個this關鍵字。
這種語法在.net中稱作擴充套件方法。
擴充套件方法:使你能夠向現有型別「新增」方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫。對於用c# 和visual basic 編寫的客戶端**,呼叫擴充套件方法與呼叫在型別中實際定義的方法之間沒有明顯的差異。
1. 定義乙個靜態類以包含擴充套件方法。該類必須對客戶端**可見。
2. 將該擴充套件方法實現為靜態方法,並使其至少具有與包含類相同的可見性。
3. 該方法的第乙個引數指定方法所操作的型別;該引數必須以this 修飾符開頭。
4. 在呼叫**中,新增一條using 指令以指定包含擴充套件方法類的命名空間。
5. 按照與呼叫型別上的例項方法一樣的方式呼叫擴充套件方法。
1.定義擴充套件類myextension,定義擴充套件方法getmessage
namespace extensionmethods}}
2.呼叫擴充套件方法
using system;using extensionmethods;
namespace extensionmethods
}}
1. 定義乙個介面ifly
namespace extensionmethods}
2. 定義乙個duck類繼承ifly介面
using system;namespace extensionmethods
}}
3. 定義擴充套件類flyextension,定義擴充套件方法lowspeedfly
using system;namespace extensionmethods
}}
4. 呼叫擴充套件方法
duck duck = new duck();duck.lowspeedfly();
注意:1. 可以使用擴充套件方法來擴充套件類或介面,但不能重寫擴充套件方法。
2. 與介面或類方法具有相同名稱和簽名的擴充套件方法永遠不會被呼叫。
3. 編譯時,擴充套件方法的優先順序總是比型別本身中定義的例項方法低。換句話說,如果某個型別具有乙個名為process(int i) 的方法,而你有乙個具有相同簽名的擴充套件方法,則編譯器總是繫結到該例項方法。當編譯器遇到方法呼叫時,它首先在該型別的例項方法中尋找匹配的方法。如果未找到任何匹配方法,編譯器將搜尋為該型別定義的任何擴充套件方法,並且繫結到它找到的第乙個擴充套件方法。
專案中遇到的問題總結
一 cookies方面 1 無法刪除cookies 參考 二 npm 在使用node的時候,用npm安裝了很多軟體,過一段時間沒有使用就會忘記,怎麼檢視自己全域性安裝過的包,用命令 npm list g depth 0三 cmd 切換磁碟 四 vscode 1 摺疊 cmd option 摺疊滑鼠所...
專案中遇到的相容問題總結
1.在firefox瀏覽器 draggable false 不起作用的問題 2.svg在firefox瀏覽器無法顯示問題和繪製到canvas的問題 需要使用encodeuricomponent 解決image的src源設定為svg顯示格式為data image svg xml utf8,的無法顯示問...
專案中常用的C 擴充套件方法
我們經常使用一些匿名委託來處理一些邏輯 但是在某些情況下,有可能委託是null,要是直接執行可能會拋異常 所以提供此擴充套件方法,直接可以使用例如 action.execute 來執行 namespace system public static void execute this actionac...