C#高级编程9-第12章 动态语言扩展


dynamic t = new ExpandoObject();
t.Abc = "abc";
t.Value = ;
Console.WriteLine(t.Abc);
t.Abc = "";
Console.WriteLine(t.Abc);
dynamic动态类型的值是可读可写的,它是编译型语言,而Javascript是解释性语言.因此JavaScript定义后可以引用它。而dynamic定义后,无法引用它,无法获知它的类型是什么.只有编译运行时才能获得它的类型.
因此当我们无法获知它的类型时就会出现未知的异常,比如说类型转换异常、序列化异常、对象或属性不存在等等。因此对于使用dynamic时常常需要处理系统异常。 对于dynamic动态类型,它仅仅是一种类型,对于var类型它可以是一种序列化的字符串.
 dynamic t = new ExpandoObject();
t.Abc = "abc";
t.Value = ;
Console.WriteLine(t.Abc);
t.Abc = "";
Console.WriteLine(t.Abc); Console.WriteLine(t.ToString()); var t2 = new { Abc = "abc", Value = };
Console.WriteLine(t2.ToString());

对于var而言它可以声明后立即使用它,但是它的优点是如果var声明的成员它是只读的。但是声明成员值是可以修改的.

var t2 = new { Abc = "abc", Value = new { Item= new Person() } };

对于dynamic 而言,它声明后也可以立即使用它,它的成员可读可写,但是它是没有类型的需要编码者判断其来源和属性。

DynamicObejct 是所有动态类的基类,可以从其继承以实现自己的动态对象。ExpandoObject 是一个sealed 类,已经封装好了所有方法。

static void Main(string[] args)

        {

            dynamic dynamicObject = new MyDynamicObject();

            dynamicObject.FirstName = "Alan";

            dynamicObject.LastName = "Yang";

            dynamicObject.Age = ;

            Action<dynamic> show = (item) => Console.WriteLine("My name is " + item.FirstName + " " + item.LastName

                                                               + ". I'm " + item.Age + " years old.");

            dynamicObject.Show = show;

            dynamicObject.Show(dynamicObject);

            Console.Read();

        }

public class MyDynamicObject : DynamicObject

    {

        Dictionary<string, object> _dynamicData = new Dictionary<string, object>();

        public override bool TryGetMember(GetMemberBinder binder, out object result)

        {

            bool success = false;

            result = null;

            if (_dynamicData.ContainsKey(binder.Name))

            {

                result = _dynamicData[binder.Name];

                success = true;

            }

            else

            {

                result = "Property Not Found!";

                success = false;

            }

            return success;

        }

        public override bool TrySetMember(SetMemberBinder binder, object value)

        {

            _dynamicData[binder.Name] = value;

            return true;

        }

        public override bool TryInvokeMember(InvokeMemberBinder binder,

        object[] args,

        out object result)

        {

            result = true;

            dynamic method = _dynamicData[binder.Name];

            method(args[]);

            return true;

        }

    }

ExpandoObject

static void Main(string[] args)

       {

           dynamic dynamicObject = new ExpandoObject();

           dynamicObject.FirstName = "Alan";

           dynamicObject.LastName = "Yang";

           dynamicObject.Age = ;

           Action<dynamic> show = (item) => Console.WriteLine("My name is " + item.FirstName + " " + item.LastName

                                                              + ". I'm " + item.Age + " years old.");

           dynamicObject.Show = show;

           dynamicObject.Show(dynamicObject);

           Console.Read();

       }

ViewBag

public dynamic ViewBag

      {

          get

          {

              if (_dynamicViewData == null)

              {

                  _dynamicViewData = new DynamicViewDataDictionary(() => ViewData);

              }

              return _dynamicViewData;

          }

      }

DynamicViewDataDictionary 类的定义为:

using System.Collections.Generic;

using System.Diagnostics;

using System.Dynamic;

namespace System.Web.Mvc

{

    internal sealed class DynamicViewDataDictionary : DynamicObject

    {

        private readonly Func<ViewDataDictionary> _viewDataThunk;

        public DynamicViewDataDictionary(Func<ViewDataDictionary> viewDataThunk)

        {

            _viewDataThunk = viewDataThunk;

        }

        private ViewDataDictionary ViewData

        {

            get

            {

                ViewDataDictionary viewData = _viewDataThunk();

                Debug.Assert(viewData != null);

                return viewData;

            }

        }

        // Implementing this function improves the debugging experience as it provides the debugger with the list of all

        // the properties currently defined on the object

        public override IEnumerable<string> GetDynamicMemberNames()

        {

            return ViewData.Keys;

        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)

        {

            result = ViewData[binder.Name];

            // since ViewDataDictionary always returns a result even if the key does not exist, always return true

            return true;

        }

        public override bool TrySetMember(SetMemberBinder binder, object value)

        {

            ViewData[binder.Name] = value;

            // you can always set a key in the dictionary so return true

            return true;

        }

    }

}
												

C#高级编程9-第12章 动态语言扩展的更多相关文章

  1. 【读书笔记】C#高级编程 第十二章 动态语言扩展

    (一)DLR C#4的动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分.DLR是添加到CLR的一系列服务. (二)dynamic类型 dynamic类型允许 ...

  2. python高级编程(第12章:优化学习)1

    # -*- coding: utf-8 -*-# python:2.x__author__ = 'Administrator'#由于5,6,7,8,9,10,11主要是在包,测试之类的学习所以这边就不 ...

  3. python高级编程(第12章:优化学习)3

    #微观剖析 ''' 当找到速度很慢函数时,有时还需要做到测试某个部分函数剖析工作,这需要通过手动对一部分代码速度测试完成 ''' """ import tempfile, ...

  4. python高级编程(第12章:优化学习)2

    #优化策略 #3个原则 """ 1a:寻找其他原因:确定第三方服务器或资源不是问题所在 2a:度量硬件:确定资源足够用 3a:编写速度测试:创建带有速度要求的场景 &qu ...

  5. 读《C#高级编程》第1章问题

    读<C#高级编程>第1章 .Net机构体系笔记 网红的话:爸爸说我将来会是一个牛逼的程序员,因为我有一个梦,虽然脑壳笨但是做事情很能坚持. 本章主要是了解.Net的结构,都是一些概念,并没 ...

  6. C#高级编程9 第17章 使用VS2013-C#特性

    C#高级编程9 第17章 使用VS2013 编辑定位到 如果默认勾选了这项,请去掉勾选,因为勾选之后解决方案的目录会根据当前文件选中. 可以设置项目并行生成数 版本控制软件设置 所有文本编辑器行号显示 ...

  7. C#高级编程9 第18章 部署

    C#高级编程9 第18章 部署 使用 XCopy 进行部署 本主题演示如何通过将应用程序文件从一台计算机复制到另一台计算机来部署应用程序. 1.将项目中生成的程序集复制到目标计算机,生成的程序集位于项 ...

  8. C#高级编程9 第16章 错误和异常

    C#高级编程9 第16章 错误和异常 了解这章可以学会如何处理系统异常以及错误信息. System.Exception类是.NET运行库抛出的异常,可以继承它定义自己的异常类. try块代码包含的代码 ...

  9. Azure Table storage 之改进DynamicTableEntity类为其添加动态语言扩展

    在之前的一篇文章中提到,storage类库中包含一个可以用来动态获取Azure table storage 表结构的类-DynamicTableEntity. 我们可以通过这个类,我们无需为每一个表提 ...

随机推荐

  1. python 生成器与协程

    生成器在迭代中以某种方式生成下一个值并且返回和next()调用一样的东西. 挂起返回出中间值并多次继续的协同程序被称作生成器. 语法上讲,生成器是一个带yield语句的函数.一个函数或者子程序只返回一 ...

  2. cactiez v11添加对mysql数据库、apache系统进行监控

    cactiez默认已经安装了mysql监控的模板,需要我们对服务器端和被监控的mysql客户端进行配置才能生效. 被监控的Mysql客户端: 如cactiez的IP为192.168.0.8 #添加一个 ...

  3. log4j2 使用详解

    转载自 Blog of 天外的星星: http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html Log4j 2的好处就不和大家说了,如果你搜了2,说明你 ...

  4. java多线程快速入门(一)

    1.什么是进程 比如:QQ.QQ游戏.eclipse都是进程,可以通过任务管理器查看进程 2.进程和线程区别 线程是进程的一部分,一个进程可以包含多个线程,一个线程只能属于一个进程 进程是所有线程的集 ...

  5. 用Python实现Excel的读写

    一.读excel文件的简单示例 #!/usr/bin/env python # -*- coding:utf-8 -*- import xlrd from xlrd.book import Book ...

  6. LeetCode(27): 移除元素

    Easy! 题目描述: 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1 ...

  7. PHP实现获取文件后缀名的几种常用方法

    方法1: function get_file_type($filename){ $type = substr($filename, strrpos($filename, ".")+ ...

  8. 性能测试四:jmeter进阶之逻辑控制器

    常用的逻辑控制器 1,循环控制器:可以设置该控制器内的sampler执行的次数,循环次数与线程的循环次数各自独立 2,if控制器:根据判断条件决定是否执行该控制器内的请求,如果是字符串比较条件,参数和 ...

  9. 解决Oracle出现以0开头的小数,开头的0消失的问题

    项目中碰到了个问题,本来报表需要显示“0.49%”,结果就是显示成“.49%” 找问题 首先在pl/sql工具里执行sql,发现原始的数据就是“.49%”,那么问题来了,原始sql的问题,跟工具无关了 ...

  10. Python内置数据结构--列表

    本节内容: 列表 元组 字符串 集合 字典 本节先介绍列表. 一.列表 一种容器类型.列表可以包含任何种类的对象,比如说数字.子串.嵌套其他列表.嵌套元组. 任意对象的有序集合,通过索引访问其中的元素 ...