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