zoukankan      html  css  js  c++  java
  • 理解C# 4 dynamic(2) – ExpandoObject的使用

    理解C# 4 dynamic(2) – ExpandoObject的使用

    2013-07-23 22:35 by JustRun, 4996 阅读, 3 评论, 收藏编辑

    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,为动态类型添加特征性。

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下右下角的关注 Justrun
    因为,我的写作热情也离不开您的肯定支持。

    感谢您的阅读,这里还有你可能感兴趣的文章推荐博客文章

  • 相关阅读:
    安装 Office Online Server2016
    HTML-冒泡算法
    shell 中的$0 $1 $* $@ $# $$ $? $() $(())
    线程池原理及C语言实现线程池
    彻底搞懂Reactor模型和Proactor模型
    TCP的三次握手与四次挥手理解及面试题
    socket关闭的close和shutdown区别
    C++ Virtual 完美诠释
    Linux学习之CentOS--Linux系统的网络环境配置
    Linux学习之CentOS--Linux网卡高级命令、IP别名及多网卡绑定
  • 原文地址:https://www.cnblogs.com/grj001/p/12225063.html
Copyright © 2011-2022 走看看