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

转载于:https://www.cnblogs.com/yedafeng/archive/2011/03/15/1985372.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值