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

[C# 4.0] 2. Dynamic (2)

 2010-09-30 21:04:19 来源:WEB开发网   
核心提示:.NET 4.0 通过嵌入 DLR Runtime 来实现对动态编程的支持,DLR Runtime 包含 Expression Trees、CallSite Caching、Dynamic Object Interoperability 几个子系统,[C# 4.0] 2. Dynamic (2),某些实现部分,我们在前

.NET 4.0 通过嵌入 DLR Runtime 来实现对动态编程的支持。DLR Runtime 包含 Expression Trees、CallSite Caching、Dynamic Object Interoperability 几个子系统。某些实现部分,我们在前一章分析 dynamic 关键字时已有所接触。

动态编程行为主要两个部分:

动态访问对象: 这也就是 dynamic 所要做的主要工作,我们可以在运行时 "动态" 访问对象成员,而不是编译期。

创建动态对象: 我们可以在运行期定义对象的行为,包括增删对象成员等。想必大家对动态语言的 OpenClass 已经神往已久了。

我们试着创建一些 .NET 4.0 动态调用的例子。和前一章 "动态" 调用 "静态对象成员" 不同,下面这些例子着重于 "动态对象"。

class MyClass : DynamicObject
{
  private Dictionary<string, object> values = new Dictionary<string, object>();
  public override bool TryGetMember(GetMemberBinder binder, out object result)
  {
    result = null;
    if (!values.ContainsKey(binder.Name)) return false;
    result = values[binder.Name];
    return true;
  }
  public override bool TrySetMember(SetMemberBinder binder, object value)
  {
    values[binder.Name] = value;
    return true;
  }
  public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
  {
    switch (binder.Name)
    {
      case "Test":
        var sb = new StringBuilder();
        for (int i = 0; i < binder.CallInfo.ArgumentCount; i++)
        {
          sb.AppendFormat("{0}={1}\r\n", binder.CallInfo.ArgumentNames[i], args[i]);
        }
        result = sb.ToString();
        return true;
      default:
        result = null;
        return false;
    }
  }
}
class Program
{
  static void Main(string[] args)
  {
    dynamic o = new MyClass();
    o.X = 123;
    o.Y = "Hello, World!";
    var s = o.Test(A: 123, Y: "abc");
    Console.WriteLine(o.X);
    Console.WriteLine(o.Y);
    Console.WriteLine(s);
  }
}

1 2 3  下一页

Tags:Dynamic

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