有个朋友在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

如果是能简单解决的问题,就不用想得太复杂了相关推荐

  1. Android 在Fragment中执行onActivityResult不被调用的简单解决方法

    Android 在Fragment中执行onActivityResult不被调用的简单解决方法 参考文章: (1)Android 在Fragment中执行onActivityResult不被调用的简单 ...

  2. python安装numpy模块-python的numpy模块安装不成功简单解决方法总结

    为了画个图,被numpy这个模块的安装真的折腾疯了!!!一直装不上,花了几个小时,看了网上的很多教程.方法发现总结得不是很全,这里总结一下,防止大家再出现这个问题没有解决方法. Python的魅力之一 ...

  3. [DiscuzNt]整合DiscuzNt论坛目前所发现的小BUG及个人简单解决办法

    前段时间因为公司项目需要,需要在网站中整合BBS论坛,主要实现会员信息同步,经过目前市面上开源的BBS项目,最终认为还是DiscuzNt比较好,原因有以下几点: 1.符合国人习惯,DiscuzNt是由 ...

  4. 【已解决】对JSP页面传值中文乱码的简单解决方法

    很多java程序员在日常的工作中总会遇到对JSP页面传值中文乱码的情况,一些朋友由于操作不当,造成了很大的麻烦.本文将为大家讲解关于对JSP页面传值中文乱码的简单解决方法的内容. 方法/步骤 方法一: ...

  5. 简单解决“无法打开内核设备:\\Global\\vmx86”错误

    简单解决"无法打开内核设备:\\Global\\vmx86"错误 本文链接:https://blog.csdn.net/tristan_tian/article/details/7 ...

  6. 用组策略发布软件的简单解决办法

    利用组策略发布软件的简单解决办法 今天和大家共同学习一下利用组策略来发布软件,据说是很方便的,今天就来试一下 先说点小知识点:可能大家早就已经知道.见笑见笑 软件的部署分为指派和发布两种.发布呢不具有 ...

  7. ECSHOP中transport.js和jquery的冲突的简单解决办法

    ECSHOP中transport.js和jquery的冲突的简单解决办法 一流资源网近日在ECSHOP网站加入了几个JS特效代码,在谷歌.火狐下正常,在各版本IE下都不常,左思不得其解. 最后才知道原 ...

  8. 简单解决Python文件中文编码问题

    这篇文章主要介绍了简单解决Python文件中文编码问题的相关资料,需要的朋友可以参考下 读写中文 需要读取utf-8编码的中文文件,先利用sublime text软件将它改成无DOM的编码,然后用以下 ...

  9. python numpy安装步骤-python的numpy模块安装不成功简单解决方法总结

    为了画个图,被numpy这个模块的安装真的折腾疯了!!!一直装不上,花了几个小时,看了网上的很多教程.方法发现总结得不是很全,这里总结一下,防止大家再出现这个问题没有解决方法. Python的魅力之一 ...

最新文章

  1. 使用组策略配置Windows 7的高级防火墙
  2. 【数据结构】用栈解决表达式求值问题
  3. 一张PDF了解JDK10 GC调优秘籍-附PDF下载
  4. ios15 LJScrollPageVC第三方框架的使用
  5. 前端学习(2328):angular之模板
  6. flutter AndroidView简述
  7. 云图说 | 华为云医疗智能体,智联大健康,AI药物研发
  8. mysql ----DML(掌握)
  9. POI3.8解决导出大数据量excel文件时内存溢出的问题
  10. 消息队列控制灯代码_基于ARM的智能灯光控制系统经验总结分享
  11. 老赵谈IL(2):CLR内部有太多太多IL看不到的东西,包括您平时必须了解的那些...
  12. 推荐10款一直在使用的Chrome提效插件
  13. 右键没有WinRAR压缩的解决方法
  14. 中国手机企业努力一年,不如苹果一周,后者在5G手机市场完胜
  15. 微信小程序文本、图片内容违规信息校验
  16. copy(copy)
  17. JavaScript最全面试题
  18. 数字识别digits.png研究
  19. 虚幻引擎:游戏设计(FPS项目) 一
  20. 设计模式 | 外观模式及典型应用

热门文章

  1. 说一说网站与搜索引擎之间不得不知的联系
  2. seo优化无法避免却又无可奈何的问题
  3. flink批量写入oracle,批量写入目标表存在重复写入问题
  4. php周计划表_PHP学习计划书
  5. graphviz linux教程,程序员绘图利器 — Graphviz
  6. 0x000000f怎么修复 win10_win10无法启动也能进安全模式?用这个方法就OK
  7. 开发日记-20190509
  8. python fuzzy c-means demo
  9. python spark 求解最大 最小 平均
  10. mysql text 不可指定默认值