我们在项目中遇到了一个非常棘手的场景。我们在项目中使用了很多反射。
我们有 ..
- 由属性和反射驱动的验证框架
- 使用属性和反射将 DataRow 转换为实体对象的扩展方法,反之亦然。我们对 DataTable 和 EntityCollections 做了同样的事情。
- IComparer 接口在通用 EntityComparer 类上实现,该类使用反射来比较两个实体对象。
与上面的场景一样,我们在应用程序的许多其他部分使用了反射。使用反射后,我们注意到应用程序通过反射花费了更多的处理周期。
我们的项目中应该在多大程度上使用Reflection?项目的哪些领域在处理方面受反射影响最大?哪里反射不会对性能产生任何影响?有使用 Reflection 的指南吗?
反射很强大,但也有缺点。一般来说,尝试在没有它的情况下进行编码 - 但它对于“框架”库非常有用,在“框架”库中,您对实际对象的了解很少/有限;例如:
- ORM / DAL 工具(加载/保存任意数据)
- 数据绑定
- 序列化
临时反射会带来性能损失,但如果您打算这样做lots(在你的库中,并且在一个紧密的循环中)你可以缓解这种情况:
- 通过使用Delegate.CreateDelegate http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx (as a typed代表;不要使用
DynamicInvoke
)
- 通过编写动态IL
- 通过使用
Expression
在.NET 3.5中
当然,任何这样的代码都应该被缓存和重用(您不想为每个调用都编译+执行;只是第一个 - 其余的应该只执行)。
或者有一些库对此进行了抽象;例如,超属性描述符 http://www.codeproject.com/KB/cs/HyperPropertyDescriptor.aspx将自定义 IL(用于成员访问)包装在熟悉的环境中PropertyDescriptor
API - 使其非常快速但轻松。您的问题提到了数据表和实体;这听起来是lot like 上一个问题 https://stackoverflow.com/questions/564366#564373,我使用 HyperDescriptor 做了一些指标,并附有摘要(以毫秒为单位):
Vanilla 27179
Hyper 6997
所以我的“看法”是:
- in the 应用;很少——通常作为最后的手段
- in your 公共图书馆/图书馆;在适当的情况下(注意接口等在可能的情况下是更好的)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)