C# 4 中的 Expando 对象
2010-09-30 22:46:55 来源:WEB开发网图 5 ReSharper 5.0 智能感知与 Expando 对象
若要向 Expando 对象添加方法,只需将其定义为属性,除非您使用 Action<T> 或 Func<T> 委托来表达行为。例如:
person.GetFullName = (Func<String>)(() => {
return String.Format("{0}, {1}",
person.LastName, person.FirstName);
});
方法 GetFullName 会返回一个字符串,该字符串是通过将 Expando 对象中假设存在的姓和名属性合并起来获得的。如果您尝试访问 Expando 对象中缺少的成员,将会收到 RuntimeBinderException 异常。
由 XML 驱动的程序
为了让您综合理解到目前为止我所讲过的概念,让我为您介绍一个示例,其中数据结构和 UI 结构均在 XML 文件中定义。文件内容被解析到一系列 Expando 对象中,并由应用程序处理。但是,应用程序只处理动态形式的信息,也并未绑定到任何静态类型。
图 3 中的代码定义了一系列动态定义的 person Expando 对象。正如您期望的,如果向 XML 架构中添加一个新节点,就会在 Expando 对象中创建一个新属性。如果您需要从外部源读取成员的名称,应当使用索引器 API 将其添加到 Expando 中。ExpandoObject 类显式实现了 IDictionary<String, Object> 接口。这意味着您需要将 ExpandoObject 接口从字典类型中隔离,以便使用索引器 API 或 Add 方法:
(person as IDictionary<String, Object>)[child.Name] = child.Value;
更多精彩
赞助商链接