zoukankan      html  css  js  c++  java
  • 使用委托把方法写得更容易维护

    一、背景介绍

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

    委托是不是很好用呢。

  • 相关阅读:
    scikit-image 库简介
    如何下载网易云音乐APP里的MV和短视频?
    CentOS上用Squid搭建HTTP代理小结
    超简单的晃咖、小咖秀视频去水印下载方法
    自媒体攻略合集,教你如何做一名能赚钱的自媒体人
    怎么下载映客的视频?映客小视频下载到本地的方法
    如何把手机app的视频下载到手机上?网页上的视频怎么下载?
    短视频如何制作?如何下载短视频?常用的短视频录制和剪辑App有哪些?
    JVM jinfo命令(Java Configuration Info) 用法小结
    iOS11有哪些新功能?旧iPhone是否真的变慢了
  • 原文地址:https://www.cnblogs.com/lhking/p/11359038.html
Copyright © 2011-2022 走看看