DLR(Dynamic Language Runtime)基本概念还是比较直观的。一般情况下,如果你传递了一个.NET object给DLR,DLR会通过反射来调用相关的成员。 obj.Property会被DLR自动映射到对象的Property属性,obj.Method()会被DLR自动映射到对象的Method方法。如果对象实现了IDynamicMetaObjectProvider接口,事情会稍稍变得有点复杂。简单来说,对于obj.Property,DLR会通过DynamicMetaObject.BindGetMember()来调用相应属性。而对于obj.Method(),DLR会通过DynamicMetaObject BindInvokeMember()来调用相应的方法。在这里顺便提一下,DynamicMetaObject.BindGetMember()和DynamicMetaObject BindInvokeMember()的默认实现就是去调用相应的属性和方法。
如果要是一直能活在一般情况下,人生会是多么美好啊。
函数在Python中属于First Class Object。对于obj.Method(),Python将它解释为:
func = obj.Method
func()
这样子带来了一个问题。如果在IronPython中运行obj.Method(),IronPython引擎会首先首先调用DynamicMetaObject.BindGetMember()来得到相应的函数,接下来调用这个函数来执行相应的操作。这里根本没DynamicMetaObject BindInvokeMember()有什么事……随之而来的问题是:如何在DynamicMetaObject.BindGetMember()中返回函数呢?当然是委托了。
至于如何在DynamicMetaObject.BindGetMember()中创建委托,大家可以参考这段代码。