ExpandoObject的使用非常简单,很容易入手。上一篇里面已经有详细的介绍了,可以看这里
(理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用)

下面对ExpandoObject的使用场合和一些认为需要注意的地方,谈一下自己的看法:

一,ExpandoObject使用场合

在传递对象,但是又不想创建一个class或者struct的时候,ExpandoObject就是一个非常好的选择。
假如我们有一个SendMail的函数,功能是发送一个通知邮件给客户,邮件的文本模板,如下:
Dear [Name],
We have sent the gift to your address: [Address]

在具体发送邮件的时候, [Name]和[Address]的内容是从函数GetMailParameters()动态读取出来的。
那么函数GetMailParameters的返回值如何定义好呢?

如果为GetMailParameters()函数创建一个struct或者class来传递, 有些小题大做了,而且定义的struct和class重用性会非常低。

如果使用了ExpandoObject, 就非常容易的解决了这个问题。

public dynamic GetMailParameters()

{

var mailParameters = new ExpandoObject();

mailParameters.Name=”Peter”;

mailParameters.Address=”Shanghai China”

return mail;

}

就算以后邮件模板改变,添加了新的变量,也只是简单的在ExpandoObject上扩展一个属性就可以了。

二, 注意问题

由于ExpandObject的先天不足(无特征性):

1. 没有区分的类型名称
2. 没有确切类型定义

如果你看到一个string的函数返回值, 你会想到什么, 你会知道它是一个字符串(这不是废话吗?), 有Length等属性,有IndexOf等方法。
当返回值是MailHelper类对象时,你想只需要直接F12就能看到源码,里面有关于这个类的详细定义,接着你就知道如何使用这个对象了。

当你从一个函数中得到一个ExpandObject的dynamic的返回值时,你知道是什么吗? ExpandObject就是一个黑箱,里面装着什么,谁都不知道。
所以,

1. ExpandObject不能用于太复杂的对象。

ExpandObject最好还是作为简单的数据容器,不要弄得过于复杂,甚至包含有函数处理。

2.ExpandObject的使用范围必须要短

范围短的意思是,产生和使用ExpandObject的代码的路径必须要短(主要是函数调用路径)。如果你正在使用一个ExpandObject对象,查看产生这个ExpandObject的地方,发现分散在好几个函数之中,还有嵌套的话,那么这个ExpandObject是非常难于维护的。

3. ExpandObject的使用场合最好贴近程序的终端。

比如在MVC中的ViewBag, 就是一个好的例子。ViawBag用于生成页面, 而页面就是MVC程序的终端了。到了终端,ExpandObject也就不能祸害它人了。
正是由于ExpandObject的无特征性,什么都可以做,所以容易导致滥用。

下篇介绍如何通过继承DynamicObject和实现IDynamicMetaObjectProvider,为动态类型添加特征性。

原文地址:http://www.cnblogs.com/JustRun1983/p/3209573.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

理解C# 4 dynamic(2) – ExpandoObject的使用相关推荐

  1. 理解C# 4 dynamic(4) – 让人惊艳的Clay

    一,多种方式初始化对象 1, 最简单的对象构建和初始化 dynamic New = new ClayFactory();var person = New.Person(); person.FirstN ...

  2. 理解C# 4 dynamic(3) – DynamicObject的使用

    上篇文章"理解C# 4 dynamic(2) – ExpandoObject的使用" 了解了xpandoObject的基本使用.但ExpandoObject的问题就是它是一个万金油 ...

  3. 在MVC控制器里面使用dynamic和ExpandoObject,实现数据转义的输出

    1.数据信息的展示 一般情况下,我们在界面里面展示的信息是相对比较丰富的,尽管我们设计数据表的时候,考虑的是如何精简且避免重复,但是在界面上展示的信息,往往是考虑如何让用户更加方便,因此可能尽可能的展 ...

  4. C#中dynamic、ExpandoObject 的正确用法

    原文地址:http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html dynamic是FrameWork4.0的新特性.dynam ...

  5. 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用

    一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你可以用它们声明的变量赋任何类型的值. 看看下面的示例: var a = 1;object b = 1; dynamic c = ...

  6. 什么是python语言的动态类型机制_理解Python的Dynamic typing

    Python的Dynamic typing有些类似于C语言的指针,在C中,一个变量可以指向任何地址空间,在Python中,一个变量也可以指向任何type的数据对象.变量的指向可以在程序运行过程中变化, ...

  7. var和dynamic的应用 var、动态类型 dynamic 深入浅析C#中的var和dynamic ----demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. 了解 C# “.NET研究”4 中的 Dynamic 关键字

    dynamic 关键字和动态语言运行时 (DLR) 是 C# 4 和 Microsoft .NET Framework 4 中的重大新增功能. 这些功能在宣布时就引起了人们的极大兴趣,并伴随着许多疑问 ...

  9. 算法-动态规划 Dynamic Programming--从菜鸟到老鸟

    前言 最近在牛客网上做了几套公司的真题,发现有关动态规划(Dynamic Programming)算法的题目很多.相对于我来说,算法里面遇到的问题里面感觉最难的也就是动态规划(Dynamic Prog ...

最新文章

  1. 阿里云ECS架设***过程总结
  2. 通配符(WildCard)的使用
  3. 微服务feignclient_微服务-(声明式调用feign)
  4. 修改pytho2安装插件的位置_office2016自定义安装以及修改安装位置
  5. 消息中间件:RocketMQ 介绍(特性、术语、原理、优缺点、消息顺序、消息重复)
  6. 十大面试问题解惑,秒杀一切HR、技术面试。iOS程序员必读!
  7. sqlserver备份还原丢失dbo_编程实现备份和还原数据库_sqlserver
  8. 我的世界服务器领地怎么无限大,我的世界:Minecraft都市传说,MC无限大?让我们一起寻找边界吧...
  9. java环境_Java 开发环境配置
  10. 除adsense外适合英文站的国外广告联盟(4/12/2011更新)
  11. 触发器(数据库原理术语)
  12. 银行卡格式化(每四位空格,删除添加,更变等)
  13. 后端开发工程师需要掌握的内容
  14. linux下ps ef命令详解,linux命令中ps -ef详解
  15. 对对碰(网页版单机小游戏)
  16. 【Python】多线程爬取某站高颜值小姐姐照片(共1.62GB)
  17. 樱花的季节,教大家用canvas画出飞舞的樱花树
  18. 连接到服务器 ------------------------------ 无法连接到 + SQL Server 请求失败或服务未及时响应....解决思路
  19. python常用进制转换
  20. 突破性能瓶颈!ElasticSearch百亿级数据检索优化案例

热门文章

  1. 实施Exchange 2013中的 MailTip
  2. SQL SERVER2000存储过程调试
  3. 用拖拉实现设备驱动配置(EsayHMI最新驱动配置方式)
  4. .NET6之MiniAPI(二十九):UnitTest
  5. .Net Core手撸一个基于Token的权限认证
  6. c#使用PdfiumViewer展示、打印pdf文档
  7. 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序
  8. NET流行高性能JSON框架-Json.NET
  9. FastTunnel-开源内网穿透框架
  10. Hosting in .NET Core