1 概述:

在早期的.NET Framework中,“Var”关键字和匿名方法开启了C#走向动态的道路,在4.0中,动态类型被添加进去。尽管C#是一个静态类型的语言,但这些额外的添加给C#带来了动态的能力。在这一章中,我们探讨一下动态类型以及它的一些使用规则,包括DynamicObject的实现和它的使用。

2 动态语言运行时(Dynamic Language Runtime)

C# 4.0中的动态是动态语言运行时(DLR)的一部分,DLR是被添加进CLR中的一系列服务,它允许添加额外的动态语言,比如Ruby 和Python, 而且还允许C#具有一些这些动态语言所拥有的功能。

在.NET Framework中,DLR位于System.Dynamic命名空间,其他一些相关的类位于System.Runtime.CompilerServices命名空间。

3 动态类型(The  Dynamic Type):

动态类型允许你的代码绕过编译时的类型检查,编译器假设你为动态对象定义的一切操作都是合法的,如果定义的操作非法,错误也只会在运行时被侦测。

与var不同的是,一个对象如果被定义为Dynamic,它可以在运行时改变类型。需要记住的是,当var被使用,对象的目标类型会被延迟,一旦类型被确定,它将不能够改变。而动态类型不仅可以改变,而且还可以改变很多次,注意这和对象的类型转换是不同的。例如:int 不能够转换成Person类型,但是如果对象是dynamic的,就可以这样做。

dynamic dyn=100;

Console.WriteLine(dyn.GetType());

dyn=”This is a string”;

Console.WriteLine(dyn.GetType());

dyn=new Person(){FirstName=”Terry”,LastName=”Cheng”};

Console.WriteLine(dyn.GetType());

执行上面的代码,我们可以看出dyn对象实际上从System.Int32转换成System.String,然后转换成Person对象。如果dyn对象被申明为int 或者string,以上代码将不会被编译。

dynamic类型的限制:1)动态对象不支持扩展方法。2)匿名方法,λ表达式不能作为动态方法调用的参数。3)Linq也不适用于动态对象。

4 寄宿DLR 脚本运行时(Hosting the DLR ScriptRuntime):

寄宿DLR脚本运行时可以让你的应用程序有添加脚本的能力,通过将参数传入或者传出脚本,可以让你的应用程序充分利用脚本所做的工作。当前可以支持的寄宿脚本语言有IronRuby,IronPython,和JavaScript。

使用脚本运行时,你能够执行存储在文件中的一段或者全部的脚本,你可以选择合适的语言引擎或者让DLR来确定哪个引擎。你不仅可以从脚本里传入或者传出参数值,而且还可以在动态对象上调用写在脚本里的方法。

脚本运行时环境的建立:1)创建ScriptRuntime 对象。2)设置合适的脚本引擎(ScriptEngine)。3)创建ScriptSource。4)创建ScriptScope。

注:ScriptRuntime对象是脚本寄宿的开始和基础,它拥有寄宿环境的全局状态,通过静态方法CreateFromConfiguration来创建。下面是app.config文件的配置:

以IronPython脚本语言为例:

<configuration>

<configSections>

<section

name="microsoft.scripting"

type="Microsoft.Scripting.Hosting.Configuration.Section,

Microsoft.Scripting,

Version=0.9.6.10,

Culture=neutral,

PublicKeyToken=null"

requirePermission="false" />

</configSections>

<microsoft.scripting>

<languages>

<language

names="IronPython;Python;py"

extensions=".py"

displayName="IronPython 2.6 Alpha"

type="IronPython.Runtime.PythonContext,

IronPython,

Version=2.6.0.1,

Culture=neutral,

PublicKeyToken=null" />

</languages>

</microsoft.scripting>

</configuration>

5 DynamicObject and ExpandoObject对象:

1)通过继承DynamicObject或者使用ExpandoObject,你可以创建自己的动态对象。不同之处是继承DynamicObject时,你需要重写相应的方法,而ExpandoObject是一个Sealed的类,可以直接使用。

2)不能够直接创建一个空的dynamic对象,动态对象必须赋值。

比如:dynamic dyn; dyn.FirstName=”Terry”将会报错。但是使用ExpandoObject可以。

3) 如果你想在自定义的动态对象中添加属性控制,那么继承DynamicObject是首选。此外通过重写相关的方法,你能够控制自定义的对象和运行时的交互。

转载于:https://www.cnblogs.com/chengzq/archive/2011/01/20/1940002.html

C# 动态语言扩展(学习笔记)相关推荐

  1. Go语言开发学习笔记(持续更新中)

    Go语言开发学习笔记(持续更新中) 仅供自我学习 更好的文档请选择下方 https://studygolang.com/pkgdoc https://www.topgoer.com/go%E5%9F% ...

  2. R语言可视化学习笔记之ggridges包绘制山峦图

    作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源. 严涛老师的绘图教程还有: gganimate |诺奖文章里面的动图绘制教程来了!! ggplot2学习笔记之 ...

  3. c语言用户自己建立数据类型,C语言程序设计学习笔记--用户建立数据类型

    C语言程序设计学习笔记--用户建立数据类型. 9.1定义和使用结构体变量 1.定义:C语言允许用户自己建立不同类型数据组合成的组合型数据类型就是结构体 2.形式: struct 结构体名 { 成员表列 ...

  4. 《C语言基础学习笔记》—— 黑马程序员 <Part1-4>

    <C语言基础学习笔记 Part1-4> Part 1 基础介绍 1. 第一个C语言程序:HelloWorld 1.1 编写C语言代码:hello.c 1.2代码分析 1)include 头 ...

  5. c语言运算符感想,C语言运算符学习笔记

    运算符不仅具有不同的优先级,还有不同的结合性.在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算. C语言的 ...

  6. go语言基础学习笔记完整版

    目录 背景 基础 helloworld 变量 常量 数据类型 基本数据类型与复杂数据类型 值类型与引用类型 查看变量类型 字符与字符串 类型转换 指针 打包 读取控制台数据 for-range遍历 生 ...

  7. R语言小白学习笔记3—R语言读取数据

    R语言小白学习笔记3-R语言读取数据 笔记链接 想说的话 学习笔记3-R语言读取数据 3.1 读取CSV文件 3.1.1 read_delim函数 3.1.2 fread函数 3.2 读取Excel数 ...

  8. R语言可视化学习笔记之相关矩阵可视化包ggcorrplot

    本文转载自"R语言中文社区",己获授权. 作者简介Introduction taoyan:伪码农,R语言爱好者,爱开源. 个人博客: https://ytlogos.github. ...

  9. c语言课程笔记格式,C语言课程学习笔记.docx

    C语言课程学习笔记 C语言基础语言排行榜C--java--objective-C进制:进制:进位机制.用普通的话讲,应该为人为的定义一种度量来标识一样东西.计算机常用的进制有:十进制.二进制.八进制和 ...

  10. C语言程序设计学习笔记:P1-程序设计与C语言

    本系列博客用于记录学习浙江大学翁恺老师的C语言程序设计,系列笔记链接如下: C语言程序设计学习笔记:P1-程序设计与C语言 C语言程序设计学习笔记:P2-计算 C语言程序设计学习笔记:P3-判断 C语 ...

最新文章

  1. OpenCV 相机校正过程中,calibrateCamera函数projectPoints函数的重投影误差的分析
  2. 每日一皮:这翻译...真辛苦老外看纪录片纯靠脑补 ...
  3. PAT甲级1029 Median:[C++题解]贪心、二路归并
  4. python pipeline框架_介绍Python的Django框架中的静态资源管理器django-pipeline
  5. 关于几种编码的那些事
  6. 对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解
  7. 【100题】第三十三 高级字符匹配(和谐系统原理)
  8. Spring IOC之Bean初始化篇
  9. lr接口压测_LoadRunner+Java接口性能测试
  10. 在macOS Sierra 10.12.3下用VMware Fusion安装Ubuntu 16.04.2
  11. postman测试JSON参数接口
  12. js替换字符串中的${xxx}
  13. Acwing 1402.星空之夜
  14. boost::stacktrace::detail相关的测试程序
  15. HBM (High Bandwidth Memory)
  16. 门店定位怎么在地图上显示_门店位置如何显示在地图上?
  17. 软件发明专利实例_软件发明专利思路(精)
  18. 短时傅里叶变换(STFT)及matlab
  19. 微网站 源码 php,DIYWAP手机微网站内容管理系统 php版 v6.3
  20. java 新手入门电子书_Java基础入门指导(适合所有初学者).pdf

热门文章

  1. Mike Krueger 加入Mono团队
  2. mysql 创建唯一索引_Mysql普通索引和唯一索引的选择分析
  3. 有关python的知识点_Python常见的知识点整理
  4. 人渣scum服务器物品,人渣SCUM可以采集物品一览_可采集食物大全_可可网
  5. mysql修改数据存放位置_Mysql 修改数据库存放位置
  6. Python机器学习:SVM006什么是核函数?
  7. 数据科学入门与实战:玩转pandas之三
  8. php mysql 导出到excel,php mysql数据导出到excel文件
  9. GP学习(十)-Mosaic raster datasets to a file raster format
  10. 分数加减乘除混合运算带答案_分数分数加减乘除混合运算练习题及答案_0.doc