[C# 4.0] 1. Dynamic
2010-09-30 21:04:24 来源:WEB开发网在 CSharpInvokeMemberBinder 中我们发现了 DynamicMetaObject 这样的字眼,想必和动态调用有所关联。我们暂时不深究,回到最初的流程。
public sealed class CallSite<T> : CallSite where T: class
{
// Fields
public T Target;
// Methods
public static CallSite<T> Create(CallSiteBinder binder);
// Properties
public T Update { get; }
}
"CallSite<Action<CallSite, object>>.Create(binder),Target 就变成了一个委托字段,也就是说最终的动态调用代码 "SiteContainer0.site1.Target(SiteContainer0.site1, o)" 其实是对这个委托的调用。那么我们可以大胆猜测一下,编译器会使用 binder 提供的信息动态生成一个委托,如此来完成所谓的动态化。
现在的关注重点就是如何生成委托 Target。
public sealed class CallSite<T> : CallSite where T: class
{
public static CallSite<T> Create(CallSiteBinder binder)
{
return new CallSite<T>(binder);
}
private CallSite(CallSiteBinder binder) : base(binder)
{
this.Target = this.GetUpdateDelegate();
}
private T GetUpdateDelegate()
{
return this.GetUpdateDelegate(ref CallSite<T>._CachedUpdate);
}
private T GetUpdateDelegate(ref T addr)
{
if (((T) addr) == null)
{
addr = this.MakeUpdateDelegate();
}
return addr;
}
}
更多精彩
赞助商链接