在我阅读过的有关反射的所有书籍中,它们经常说生成动态IL并不是很常见的情况,但它们没有给出任何实际应用的例子。
看到一家游戏公司将 Reflection.Emit 作为工作要求后,我好奇还有哪些地方正在使用它。
现在我想知道您是否见过真实世界中使用 Reflection.Emit 是解决问题的最佳方案的情况。也许它被用作设计模式的实现?
注意: 我想象 PostSharp / AOP 使用它。
在我阅读过的有关反射的所有书籍中,它们经常说生成动态IL并不是很常见的情况,但它们没有给出任何实际应用的例子。
看到一家游戏公司将 Reflection.Emit 作为工作要求后,我好奇还有哪些地方正在使用它。
现在我想知道您是否见过真实世界中使用 Reflection.Emit 是解决问题的最佳方案的情况。也许它被用作设计模式的实现?
注意: 我想象 PostSharp / AOP 使用它。
Expression.Compile
的本质是这样的——这是LINQ中一些关键内容的关键。
我目前正在使用反射发射(reflection emit)重新编写序列化API,因为有时候反射并不能胜任。正巧这也允许它生成dll文件(类似于sgen的方式),从而实现完全的静态代码(我希望这将使其对iPhone更加友好)。
我还在HyperDescriptor中使用了类似的方法,以提供非常快速的基于名称的属性查找。
我还使用发射做了一些事情,比如:
全部与Stack Overflow上的问题相关。
最后,这种IL方法是protobuf-net“v2”核心的原因;原因在于它允许我在运行时拥有快速的模型(通过即时编译IL来编译它),并且能够将同样的代码直接编写到静态编译的dll中,以便在iPhone、Phone 7等设备上使用(这些设备缺乏必要的元编程API)。
我将其用作一种在运行时创建动态代理以包装类的方法。NHibernate使用相同的模式将对POCO对象的调用代理到查询数据库。
任何时候,您想要能够动态“编写代码”(即创建新函数等),都需要Emit
。
System.Linq.Expressions
命名空间中引入Compile()
方法之前,这种情况曾经更为普遍。 - Sam HarwellCastle DynamicProxy用于创建动态代理。然后,Castle的IoC容器Windsor和OR映射器ActiveRecord使用DynamicProxy。
Relection.Emit
的使用。基本上,作者针对给定的图像专门设计了一个函数来执行某个特定的图像处理操作,这反过来又导致执行时间大大缩短。我曾在一个应用程序中使用过它,该应用程序需要通过反射重复访问属性(因为在编译时无法知道属性名)。
通过在运行时创建一个帮助类来生成访问属性的代码,生成的代码比原始的仅反射代码快上数量级。
模拟库也使用Reflection.Emit生成在单元测试中使用的代理。
生成声明式代码,例如使用接口声明基础HTTP REST服务。https://github.com/neurospeech/retro-core-fit
性能增强器,大部分时间我使用 Expression.Compile
创建代码片段,通过编译给定表达式来快速检索信息,以便在将来执行编译的委托。如果使用 PropertyInfo.GetValue
,它会非常慢,但是如果创建一个访问属性的表达式并将其编译为委托(内部使用Reflection.Emit),则可以节省大量CPU时间。