[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 几个子系统。某些实现部分,我们在前一章分析 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);
}
}