WEB开发网
开发学院软件开发C语言 [C# 4.0] 1. Dynamic 阅读

[C# 4.0] 1. Dynamic

 2010-09-30 21:04:24 来源:WEB开发网   
核心提示: 在 CSharpInvokeMemberBinder 中我们发现了 DynamicMetaObject 这样的字眼,想必和动态调用有所关联,[C# 4.0] 1. Dynamic(5),我们暂时不深究,回到最初的流程,编译器会使用 binder 提供的信息动态生成一个委托,如此来完成所谓的动态化

在 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;
  }
}

上一页  1 2 3 4 5 6 7 8  下一页

Tags:Dynamic

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接