C# 4 中的 Expando 对象
2010-09-30 22:46:55 来源:WEB开发网函数将返回一系列动态定义的对象。通过 LINQ-to-XML,您可以解析出标记中的节点,并为每个节点创建一个 ExpandoObject 实例。<Person> 下的每个节点的名称都会成为 Expando 对象的一个新属性。属性值是节点的内部文字。基于 XML 内容,您得到了一个 Expando 对象,其 FirstName 属性设置为 Dino。
然而,在图 3 中,您可以看到一个索引器语法,用于填充 Expando 对象。这还需要做进一步的解释。
在 ExpandoObject 类中
ExpandoObject 类位于 System.Dynamic 命名空间中,在 System.Core 程序集中定义。ExpandoObject 代表一个对象,该对象的成员可以在运行时动态添加或删除。该类是密封的,并且可以实现多个接口:
public sealed class ExpandoObject :
IDynamicMetaObjectProvider,
IDictionary<string, object>,
ICollection<KeyValuePair<string, object>>,
IEnumerable<KeyValuePair<string, object>>,
IEnumerable,
INotifyPropertyChanged;
正如您看到的,该类使用了多个可枚举接口,包括 IDictionary<String, Object> 和 IEnumerable,来提供其内容。此外,它还实现了 IDynamicMetaObjectProvider。这是一个标准接口,能够让某个对象在动态语言运行时 (DLR) 内由依照 DLR 互操作性模型编写的程序共享。换句话说,只有实现 IDynamicMetaObjectProvider 接口的对象能够跨 .NET 动态语言共享。例如,Expando 对象可被传递到 IronRuby 这样的组件。如果使用常规的 .NET 托管对象,就无法轻易做到这一点。或许您可以,但不会获得动态行为。
ExpandoObject 类还实现了 INotifyPropertyChanged 接口。这样,添加或修改成员时,该类就会引发一个 PropertyChanged 事件。支持 INotifyPropertyChanged 接口对于在 Silverlight 和 Windows Presentation Foundation 应用程序前端使用 Expando 对象至关重要。
更多精彩
赞助商链接