关于使反思飞行和探索代表的问题 ......
如果我需要为Func
动态加载类型的方法创建委托,我可能会使用(1)Delegate.CreateDelegate
(2)DynamicMethod
(3)Expression
树.
让我们说一组动态加载的类型/方法在应用程序启动时通过config反映一次,并在应用程序的整个生命周期中使用(启动性能不是问题,也不是内存),代理被缓存并分派到一个强烈的方式.这些代理是同时访问的热路径.
您更喜欢哪种动态绑定方法?为什么?
如果它们实际上是你所拥有的现有方法MethodInfo
,并且它们具有正确的签名,那么我认为这Delegate.CreateDelegate
是正确的方法 - 它完全符合你的要求,没有大惊小怪.DynamicMethod
如果我需要构建一个委托来执行一些尚未在方法中捕获的逻辑,我会使用或表达树.
表达树是(IMO,我没有用过DynamicMethod
愤怒)稍微容易使用DynamicMethod
,但它们更受限制 - 基本上它们只能代表一个表达式(当然可以调用另一种方法).DynamicMethod
给你很大的灵活性,但你需要合理地理解IL.
这有帮助吗?
通过Ayende的博客,我得到了这个有趣的链接,展示了你可以用动态方法做的事情.作为一个例子,它是可以理解的:
使用Generic EnumComparer加速基于枚举的字典
更新
应该注意的是,在WinRT的世界中,Reflection.Emit
不可用 - 这里可以找到一些信息