如果是能简单解决的问题,就不用想得太复杂了
有个朋友在MSN问我说,有没有关于Emit的资料,它想生成一个类的动态代理。他抱怨Emit还是很麻烦,不过交谈过后知道他是想要做什么。他希望为一个对象的某个属性作延迟加载,这样可以避免一些无谓的消耗。例如:
public class SomeClass {public int SomeID { get; set; }// some other members... }
原本构造一个SomeClass时可以这样:
var someClass = new SomeClass(); someClass.SomeID = GetSomeID(); Process(someClass);
但是由于Process方法中可能不需要用到SomeID属性,于是在外部调用的GetSomeID方法可能就形成了无谓的性能损耗。一个常见的做法方式可能就是进行延迟加载了。那位朋友的意思是先把SomeID标为virtual:
public class SomeClass {public virtual int SomeID { get; set; }// some other members... }
然后使用Emit来生成一个动态类型,继承SomeClass,override掉SomeID属性,形成延迟加载。不过我提出,这个方法是不是太重了,因为动态代理不是那么孤立存在的,它往往需要考虑很多其他东西。例如缓存动态类型,例如,对于相同类型一个成员或多个成员的延迟加载,使生成一个通用的动态类型,还是多个动态类型。例如……怎么样的API是最合适的?
所以,如果只是简单的情况下,不如直接手动来实现这样的延迟效果:
public class LazySomeClass : SomeClass {public override int SomeID{get{return this.LazySomeID.Value;}set{this.LazySomeID.Value = value;}}public Lazy<int> LazySomeID { get; set; } }
于是在使用的时候就可以:
var someClass = new LazySomeClass(); someClass.LazySomeID = new Lazy<int>(() => GetSomeID()); Process(someClass);
这样其实就可以在一定程度上达到目的了。Lazy类的原理在之前也有过提及(这里需要些修改),这是一种简单但有用的类型。其实在项目的许多情况下,我们这么做也足够了。不需要复杂的方法,不需要复杂的Emit。不过如果您是为了锻炼能力,或者由于项目中此类需求特别多,想设计一个通用的的类库,这也不错。
当然,上面的实现也有缺陷,因为它不是最理想、最完整、最通用的延迟加载代理类(为什么?)。如果您感兴趣,也可以想象一个完美的代理类应该是什么样子的,甚至给出一个通用的辅助类库。
哦,对了,NHibernate的做法其实也不完美,有机会我会分析一下,并阐述我的看法的。
转载于:https://www.cnblogs.com/JeffreyZhao/archive/2009/09/05/simple-over-complex.html
如果是能简单解决的问题,就不用想得太复杂了相关推荐
- Android 在Fragment中执行onActivityResult不被调用的简单解决方法
Android 在Fragment中执行onActivityResult不被调用的简单解决方法 参考文章: (1)Android 在Fragment中执行onActivityResult不被调用的简单 ...
- python安装numpy模块-python的numpy模块安装不成功简单解决方法总结
为了画个图,被numpy这个模块的安装真的折腾疯了!!!一直装不上,花了几个小时,看了网上的很多教程.方法发现总结得不是很全,这里总结一下,防止大家再出现这个问题没有解决方法. Python的魅力之一 ...
- [DiscuzNt]整合DiscuzNt论坛目前所发现的小BUG及个人简单解决办法
前段时间因为公司项目需要,需要在网站中整合BBS论坛,主要实现会员信息同步,经过目前市面上开源的BBS项目,最终认为还是DiscuzNt比较好,原因有以下几点: 1.符合国人习惯,DiscuzNt是由 ...
- 【已解决】对JSP页面传值中文乱码的简单解决方法
很多java程序员在日常的工作中总会遇到对JSP页面传值中文乱码的情况,一些朋友由于操作不当,造成了很大的麻烦.本文将为大家讲解关于对JSP页面传值中文乱码的简单解决方法的内容. 方法/步骤 方法一: ...
- 简单解决“无法打开内核设备:\\Global\\vmx86”错误
简单解决"无法打开内核设备:\\Global\\vmx86"错误 本文链接:https://blog.csdn.net/tristan_tian/article/details/7 ...
- 用组策略发布软件的简单解决办法
利用组策略发布软件的简单解决办法 今天和大家共同学习一下利用组策略来发布软件,据说是很方便的,今天就来试一下 先说点小知识点:可能大家早就已经知道.见笑见笑 软件的部署分为指派和发布两种.发布呢不具有 ...
- ECSHOP中transport.js和jquery的冲突的简单解决办法
ECSHOP中transport.js和jquery的冲突的简单解决办法 一流资源网近日在ECSHOP网站加入了几个JS特效代码,在谷歌.火狐下正常,在各版本IE下都不常,左思不得其解. 最后才知道原 ...
- 简单解决Python文件中文编码问题
这篇文章主要介绍了简单解决Python文件中文编码问题的相关资料,需要的朋友可以参考下 读写中文 需要读取utf-8编码的中文文件,先利用sublime text软件将它改成无DOM的编码,然后用以下 ...
- python numpy安装步骤-python的numpy模块安装不成功简单解决方法总结
为了画个图,被numpy这个模块的安装真的折腾疯了!!!一直装不上,花了几个小时,看了网上的很多教程.方法发现总结得不是很全,这里总结一下,防止大家再出现这个问题没有解决方法. Python的魅力之一 ...
最新文章
- 使用组策略配置Windows 7的高级防火墙
- 【数据结构】用栈解决表达式求值问题
- 一张PDF了解JDK10 GC调优秘籍-附PDF下载
- ios15 LJScrollPageVC第三方框架的使用
- 前端学习(2328):angular之模板
- flutter AndroidView简述
- 云图说 | 华为云医疗智能体,智联大健康,AI药物研发
- mysql ----DML(掌握)
- POI3.8解决导出大数据量excel文件时内存溢出的问题
- 消息队列控制灯代码_基于ARM的智能灯光控制系统经验总结分享
- 老赵谈IL(2):CLR内部有太多太多IL看不到的东西,包括您平时必须了解的那些...
- 推荐10款一直在使用的Chrome提效插件
- 右键没有WinRAR压缩的解决方法
- 中国手机企业努力一年,不如苹果一周,后者在5G手机市场完胜
- 微信小程序文本、图片内容违规信息校验
- copy(copy)
- JavaScript最全面试题
- 数字识别digits.png研究
- 虚幻引擎:游戏设计(FPS项目) 一
- 设计模式 | 外观模式及典型应用