现实世界使用Reflection.Emit

Ryu*_*Ryu 40 .net c# reflection reflection.emit

在我读过的所有书中,他们经常说,你想要动态生成IL的情况并不多,但他们没有给出任何有意义的例子.

在看到Reflection.Emit作为游戏公司的工作要求后,我很好奇其他地方正在使用它.

我现在想知道在现实世界中是否有任何情况,这是解决问题的最佳方法.也许它被用作设计模式的实现?

注意 我想PostSharp/AOP使用它.

Mar*_*ell 14

Expression.Compile基本上这样做 - 这是一些 LINQ的关键.

我目前正在使用反射发射来重新编写序列化API - 因为有时反射不够好.碰巧这也会让它产生dll(就像sgen的工作原理一样),允许完全静态的代码(我希望这会让iPhone变得友好).

我还在HyperDescriptor中使用类似的方法来提供非常快速的基于名称的属性查找.

我也使用emit做以下事情:

所有都与SO问题有关.

最后,这种IL方法是protobuf-net"v2"的核心; 这里的原因是,它让我拥有在运行时(通过IL上飞编译它)快速模型,以同样的直接写静态编译的DLL,所以它可以作用于事物像iPhone,手机7等(缺少必要的元编程API).


Wim*_*nen 13

动态生成实现某些接口的模拟对象.执行此操作的示例框架:moq,rhino mocks.


Dav*_*fer 8

我正在使用它作为一种动态创建动态代理来包装类的方法.NHibernate使用相同的模式来代理对POCO对象的调用,而不是查询数据库.

任何时候你想要能够动态地"编写代码"(即创建一个新的函数等),你需要Emit.

  • 在System.Linq.Expressions命名空间与`Compile()`方法一起发挥作用之前,这种情况曾经更为真实. (3认同)

Dan*_*ner 7

Castle DynamicProxy将它用于动态代理.然后,Castle的IoC容器Windsor和OR映射器ActiveRecord使用DynamicProxy.


Jar*_*Par 6

DLR和DLR相关语言严重依赖 Reflection.Emit