Dynamic

.NET 4引入了一个新的概念:dynamic,简单地说就是支持运行时判断类型。它的实现依赖于编译器以及DLR,前者用于根据调用的函数来决定使用哪个CallSiteBinder,同时决定使用何种类型的delegate,最后在IL中动态生成代码。

image

以上面的代码片段为例,通过IL DASN可以得知,它并没有直接访问Test属性,编译器显然不会这么做因为sampleObject并没有这个属性。编译器会产生一个称为dynamic call site的东西,它会在运行时通过C# runtime binder以及DLR管理方法或属性的访问。下面的代码片段是从Reflector中截取出来的,它清楚地展现了对Test属性访问的真实过程。

image

从这些片段可以发现,它使用delegate和CallSiteBinder分别是Func<System.Runtime.CompilerServices.CallSite,object,string,object> SetMemberBinder

这个delegate做了以下一些事情:

1. 首先,DLR会根据参数集在cache中进行查找以判断这个操作是否已经绑定过。如果找到了,则直接使用缓存的结果;

2. 如果第一步没有成功,那么它会接下去判断被调用的类是否实现了IDynamicMetaObjectProvider。如果它实现了这个接口,它会通过调用GetMetaObject得到DynamicMetaObject。DynamicMetaObject定义了一些方法,这些方法允许你自定义动态调用方法的行为,例如BindGetMember执行的是对属性Get方法的绑定;

这里需要注意的是调用DynamicMetaObject

posted @ 2011-03-15 21:37  yedafeng  阅读(727)  评论(0编辑  收藏  举报