C# 4 中的 Expando 对象
2010-09-30 22:46:55 来源:WEB开发网创建 ExpandoObject 实例的方法与创建其他任何 .NET 对象一样,只是存储实例的变量是 dynamic 类型的:
dynamic expando = new ExpandoObject();
此时,为 Expando 对象添加一个属性只是为它分配了一个新的值,如下所示:
expando.FirstName = "Dino";
即使没有任何关于 FirstName 成员及其类型或可见性的信息,也没有关系。这是一个动态代码。正是因为这个原因,如果您使用 var 关键字将 ExpandoObject 实例分配给一个变量,结果会大为不同:
var expando = new ExpandoObject();
此代码的编译和运行都会很正常。但是,根据这个定义,您不允许为 FirstName 属性分配任何值。System.Core 中定义的 ExpandoObject 类没有这样的成员。更准确地说,ExpandoObject 类没有任何公共成员。
这一点很关键。当 Expando 对象的静态类型为 dynamic 时,操作就会绑定为动态操作,包括查找成员。当静态类型为 ExpandoObject 时,操作就会绑定为普通的编译时成员查找。因此,编译器知道 dynamic 是一个特殊类型,但是不知道 ExpandoObject 是一个特殊类型。
在图 4 中,您可以看到当 Expando 对象被声明为 dynamic 类型,以及它被当作纯 .NET 对象时,不同的 Visual Studio 2010 智能感知选项。在后一种情况中,智能感知显示了默认的 System.Object 成员,以及集合类的扩展方法列表。
图 4 Visual Studio 2010 智能感知和 Expando 对象
还应注意,在有些情况下,某些商用工具还会提供更多行为。图 5 显示了 ReSharper 5.0,该工具用于捕获对象中当前定义的成员列表。如果成员是通过索引器以编程方式添加的,就不会发生这种情况。
更多精彩
赞助商链接