上一篇写了关于反射的一些速度测试,里面涉及到克隆建立和委托执行的效率,但是有评论表示說,完全偏离了反射的主题,“动态实例和动态调用”,其实不然,我所要说明的其实并不是說如何创建一个动态委托,并且重复执行,我所要表达的是,拥有一条优雅的路线达到我所希望的要求。
在上一篇中你可以看到这么一种情况,如果使用模板克隆,效率的提高还是相当明显的,这个大家都能找到办法解决,反射对象缓存已经用的相当普遍了,我一直这么觉得,不过在网上看到一句 emit 能加速反射,不知道哪位兄弟有这方面资料提供下链接, 这里不谈那个空间,如果是IL级别的我相信完全可以做到,亦如动态生成代码,然后单次编译也不是什么难事,都能达到需要的目的,但是这里说明的是如何通过有效的委托来达到目的。
我这里提供的流程其实很简单,使用一块地方存放反射好的对象进行缓存,这个和别的没什么区别,但是重要的是储存之前, 储存之前通过反射动态建立关于对象的委托链,然后保存。
然后程序使用一个入口比如InvokeMember(string name,object[] args) 这样的一个公开入口查找相应的委托并执行,但是记住,不是动态执行,是直接执行!这样就能达到我所需要的目标和要求。而这一切对类对象的要求只有一个,继承有效的基类,然后通过新建的委托函数调用!
代码写了一些,也算50%以上了,不过今天状态不是太好,没有完成就不贴出来了,具体的测试结果也许下一篇你就能看到,我相信在这样的模式下,绝对能换来让人满意的效率。