最近在作的項目中使用了CefSharp的ChromiumWebBrowser,須要執行JavaScript代碼,因爲頁面可能會有多個iframe,因此執行JavaScript代碼的時候須要判斷當前iframe的Url。頁面的Url有時候會多一個參數,因此判斷Url,有時候用string.Equals判斷,有時候用string.StartsWith判斷。ide
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; } } }
這種是通常的寫法,代碼執行沒有問題,缺點就是代碼顯得囉嗦,維護起來不方便。url
委託是能夠把方法當作參數來傳遞的,string.Equals和string.StartsWith都是方法,因此能不能把他們當作參數來傳遞?俗話說:「遇到困難就要上,沒有困難,製造困難也要上「!spa
首先這個方法須要有返回值,因此要用Func委託,而後要有2個輸入參數,因此委託的結構就是Func<string,string,bool>,寫法以下,這樣就把具體的方法實現放在上層的調用裏了。 code
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; } } }
上層的方法調用代碼以下:blog
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方法就能夠了,不用多寫重複的邏輯。ip
委託是否是很好用呢。iframe