WEB开发网
开发学院软件开发C语言 C# 4 中的 Expando 对象 阅读

C# 4 中的 Expando 对象

 2010-09-30 22:46:55 来源:WEB开发网   
核心提示: 创建 ExpandoObject 实例的方法与创建其他任何 .NET 对象一样,只是存储实例的变量是 dynamic 类型的:dynamicexpando=newExpandoObject();此时,C# 4 中的 Expando 对象(7),为 Expando 对象添加一个属性只是为它分配了一

创建 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 成员,以及集合类的扩展方法列表。

C# 4 中的 Expando 对象

图 4 Visual Studio 2010 智能感知和 Expando 对象

还应注意,在有些情况下,某些商用工具还会提供更多行为。图 5 显示了 ReSharper 5.0,该工具用于捕获对象中当前定义的成员列表。如果成员是通过索引器以编程方式添加的,就不会发生这种情况。

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

Tags:Expando 对象

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