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

C# 4 中的 Expando 对象

 2010-09-30 22:46:55 来源:WEB开发网   
核心提示: 图 5 ReSharper 5.0 智能感知与 Expando 对象若要向 Expando 对象添加方法,只需将其定义为属性,C# 4 中的 Expando 对象(8),除非您使用 Action<T> 或 Func<T> 委托来表达行为,例如:person.GetFull

C# 4 中的 Expando 对象

图 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;

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

Tags:Expando 对象

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