随笔 - 149  文章 - 8  评论 - 248  阅读 - 21万

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

一、背景介绍

最近在做的项目中使用了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   几度夕阳红了  阅读(439)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示