基于封装的原则,api 的设计者会将部分成员(属性、字段、方法等)隐藏以保证健壮性。但总有需要直接访问这些私有成员的情况。
为了访问一个类型的私有成员,除了更改 api 设计还有就是使用反射技术:
这种写法并不优雅:
代码冗长,编写麻烦。实现比较绕,不太直观。
笔者基于“动态类型技术”探索出了一种相对来说比较优雅的方案用于美化上述代码,并为其命名为 reflectiondynamicobject :
除了支持获取值,reflectiondynamicobject 还支持赋值:
除了字段,当然也支持对属性的操作:
在对属性的支持上,reflectiondynamicobject 使用了“快速反射”技术,将取值和复制操作生成了委托以优化性能。
reflectiondynamicobject 派生自 dynamicobject ,其内部通过反射技术获取到所有的属性和字段并对其 getter 和 tter 方法进行存储并通过 trygetmember 和 trytmember 方法经运行时调用。
基于复杂度的考虑,reflectiondynamicobject 并未添加对“方法”的支持。这也就意味着对方法的调用是缺失的。虽然动态行为让程序摆脱了对字符串的依赖,但是该实现对“重构”的支持仍然不友好。
liquid 主题引擎 是笔者根据 liquid 语言和 shopify 主题机制并知危险会避险2021采用 fluid 模板引擎实现的一套 html 主题四川高考状元引擎。该引擎狼和小羊的故事允许最终用户自由的修改自己的主题模板而不会对宿主造成影响。最终目标是做到多语言、多主题、高扩展性以及所见即所得。
在编写 liquid 主题引擎 时,笔者需要重写 fluid 模板引擎的 render 标签让子湖南的大学有哪些视图从 snippets 文件夹加载。在实现该标签时,需要访问 templatecontext 的 localscope 和 rootscope 字段,不幸的是上述字段被标记为了 internal ,无法在外部程序集中访问到。于是便有了 reflectiondynamicobject ,帮助笔者完成对 localscope 和 rootscope 的访问。
liquid 模板语言: https://www.coderbusy.com/liquid
fluid 模板引擎:https://github.com/bastienros/fluid
liquid 主题引擎:https://gitee.com/zyingnet_kf/liquid-theme-engine
到此这篇关于在.net平台使用reflectiondynamicobject优化反射调用代码的文章就介绍到这了,更多相关.netreflectiondynamicobject优化反射调用内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.8小托87551.com!
本文发布于:2023-04-06 02:32:22,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/e2a07b025660f3dc80116afcd8d2e66c.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:在 .NET 平台使用 ReflectionDynamicObject 优化反射调用的代码详解.doc
本文 PDF 下载地址:在 .NET 平台使用 ReflectionDynamicObject 优化反射调用的代码详解.pdf
留言与评论(共有 0 条评论) |