使用委托把方法写得更容易维护

一、背景介绍

最近在做的项目中使用了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方法就可以了,不用多写重复的逻辑。

委托是不是很好用呢。

posted on 2019-08-16 10:25  几度夕阳红了  阅读(437)  评论(0编辑  收藏  举报