使用委託把方法寫得更容易維護

1、背景介紹

最近在作的項目中使用了CefSharp的ChromiumWebBrowser,須要執行JavaScript代碼,因爲頁面可能會有多個iframe,因此執行JavaScript代碼的時候須要判斷當前iframe的Url。頁面的Url有時候會多一個參數,因此判斷Url,有時候用string.Equals判斷,有時候用string.StartsWith判斷。ide

2、普通寫法 

        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

3、委託寫法

委託是能夠把方法當作參數來傳遞的,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;
                }
            });
        }

4、總結

使用委託的好處,是把變化的東西拿到另一個地方,不變的東西只要在一個地方進行維護。若是後面再須要增長一個string.Contains方法,只要再增長一個ExecJavascriptContainsUrl方法就能夠了,不用多寫重複的邏輯。ip

委託是否是很好用呢。iframe

相關文章
相關標籤/搜索