使用委託把方法寫得更容易維護
阿新 • • 發佈:2019-08-16
一、背景介紹
最近在做的專案中使用了CefSharp的ChromiumWebBrowser,需要執行JavaScript程式碼,由於頁面可能會有多個iframe,所以執行JavaScript程式碼的時候需要判斷當前iframe的Url。頁面的Url有時候會多一個引數,所以判斷Url,有時候用string.Equals判斷,有時候用string.StartsWith判斷。
二、普通寫法
public void ExecJavascriptEqualsUrl(string expectUrl, string js) { List<long> frameIdentifierList = cefWebBrowser.GetBrowser().GetFrameIdentifiers(); foreach (long identifier in frameIdentifierList) { IFrame frame = cefWebBrowser.GetBrowser().GetFrame(identifier); if (frame.Url.Equals(expectUrl)) { frame.ExecuteJavaScriptAsync(js); break; } } } public void ExecJavascriptStartsWithUrl(string expectUrl, string js) { List<long> frameIdentifierList = cefWebBrowser.GetBrowser().GetFrameIdentifiers(); foreach (long identifier in frameIdentifierList) { IFrame frame = cefWebBrowser.GetBrowser().GetFrame(identifier); if (frame.Url.StartsWith(expectUrl)) { frame.ExecuteJavaScriptAsync(js); break; } } }
這種是一般的寫法,程式碼執行沒有問題,缺點就是程式碼顯得囉嗦,維護起來不方便。
三、委託寫法
委託是可以把方法當做引數來傳遞的,string.Equals和string.StartsWith都是方法,所以能不能把他們當做引數來傳遞?俗話說:“遇到困難就要上,沒有困難,製造困難也要上“!
首先這個方法需要有返回值,所以要用Func委託,然後要有2個輸入引數,所以委託的結構就是Func<string,string,bool>,寫法如下,這樣就把具體的方法實現放在上層的呼叫裡了。
public static void ExecJavascript(ChromiumWebBrowser cefWebBrowser, string expectUrl, string js, Func<string, string, bool> checkUrl) { List<long> frameIdentifierList = cefWebBrowser.GetBrowser().GetFrameIdentifiers(); foreach (long identifier in frameIdentifierList) { IFrame frame = cefWebBrowser.GetBrowser().GetFrame(identifier); if (checkUrl(frame.Url, expectUrl)) { frame.ExecuteJavaScriptAsync(js); break; } } }
上層的方法呼叫程式碼如下:
public static void ExecJavascriptEqualsUrl(ChromiumWebBrowser cefWebBrowser, string url, string js) { ExecJavascript(cefWebBrowser, url, js, (frameUrl, expectUrl) => { if (frameUrl.Equals(expectUrl)) { return true; } else { return true; } }); } public static void ExecJavascriptStartsWithUrl(ChromiumWebBrowser cefWebBrowser, string url, string js) { ExecJavascript(cefWebBrowser, url, js, (frameUrl, expectUrl) => { if (frameUrl.StartsWith(expectUrl)) { return true; } else { return true; } }); }
四、總結
使用委託的好處,是把變化的東西拿到另外一個地方,不變的東西只要在一個地方進行維護。如果後面再需要增加一個string.Contains方法,只要再增加一個ExecJavascriptContainsUrl方法就可以了,不用多寫重複的邏輯。
委託是不是很好用