使用委托把方法写得更容易维护
一、背景介绍
最近在做的项目中使用了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方法就可以了,不用多写重复的逻辑。
委托是不是很好用呢。
如果本文的描述的方法或内容有问题,请给我留言。
分类:
Windows Form
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库