(一)DLR

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

(二)dynamic类型

dynamic类型允许编写忽略编译期间的类型检查的代码。编译器假定,给dynamic类型的对象定义的任何操作都是有效的,在运行之前编译器不会检测是否存在错误。

例子:

dynamic person = "人";

string firstName = person.FirstName;

这两行代码能够通过编译器编译,但是点击运行后会报错:

需要注意的是,dynamic类型虽然很有用,但是它是有代价的。

(三)包含DLR ScriptRuntime

给应用程序添加脚本编辑功能,并给脚本传入数值和从脚本传出数值,是应用程序可以利用脚本完成工作。

(四)DynamicObject和ExpandoObject

从DynamicObject中派生或者使用ExpandoObject可以创建自己的动态对象。

使用DynamicObject派生创建动态对象,需要重写3个方法TrySetMembe()、TryGetMember()和TryInvokeMember()。

使用ExpandoObject与DynamicObject进行派生的区别在于不用重写方法。

例子:

 1 class Program
2 {
3 static void Main(string[] args)
4 {
5 Func<string, string, string> getFullName = (f, l) => { return f + " " + l; };
6 dynamic byexobj = new ExpandoObject();
7 byexobj.FirstName = "李";
8 byexobj.LastName = "四";
9 byexobj.GetFullName = getFullName;
10 Console.WriteLine(byexobj.GetType());
11 Console.WriteLine(byexobj.GetFullName(byexobj.FirstName, byexobj.LastName));
12 Console.WriteLine("=====================");
13 dynamic dyobj = new MyDynamicObject();
14 dyobj.FirstName = "张";
15 dyobj.LastName = "三";
16 dyobj.GetFullName = getFullName;
17 Console.WriteLine(dyobj.GetType());
18 Console.WriteLine(dyobj.GetFullName(dyobj.FirstName, dyobj.LastName));
19 Console.ReadKey();
20 }
21 }
22
23 public class MyDynamicObject : DynamicObject
24 {
25 Dictionary<string, object> dynamicData = new Dictionary<string, object>();
26 public override bool TrySetMember(SetMemberBinder binder, object value)
27 {
28 dynamicData[binder.Name] = value;
29 return true;
30 }
31 public override bool TryGetMember(GetMemberBinder binder, out object result)
32 {
33 bool success = false;
34 result = null;
35 if (dynamicData.ContainsKey(binder.Name))
36 {
37 result = dynamicData[binder.Name];
38 success = true;
39 }
40 else
41 {
42 result = "未找到该属性的值";
43 success = false;
44 }
45 return success;
46 }
47 public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
48 {
49 dynamic method = dynamicData[binder.Name];
50 result = method((string)args[0],(string)args[1]);
51 return result != null;
52 }
53 }

运行以上代码,结果如下:

【读书笔记】C#高级编程 第十二章 动态语言扩展的更多相关文章

  1. 读书笔记 - js高级程序设计 - 第十二章 DOM2和DOM3

      Node类型的变化   访问元素的样式 myDiv.style.backgroundColor = "red" myDiv.style.width = "100px& ...

  2. 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图

    读书笔记 - js高级程序设计 - 第十三章 事件   canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好   有时候即使浏览器支持,操作系统如果缺缺 ...

  3. R in action读书笔记(16)第十二章 重抽样与自助法之 置换检验

    第十二章:重抽样与自助法 本章,我们将探究两种应用广泛的依据随机化思想的统计方法:置换检验和自助法 12.1 置换检验 置换检验,也称随机化检验或重随机化检验. 有两种处理条件的实验,十个受试者已经被 ...

  4. 【读书笔记】C#高级编程 第二十二章 安全性

    (一)身份验证和授权 安全性的两个基本支柱是身份验证和授权.身份验证是标识用户的过程,授权在验证了所标识用户是否可以访问特性资源之后进行的. 1.标识和Principal 使用标识可以验证运行应用程序 ...

  5. R in action读书笔记(17)第十二章 重抽样与自助法

    12.4 置换检验点评 除coin和lmPerm包外,R还提供了其他可做置换检验的包.perm包能实现coin包中的部分功能,因此可作为coin包所得结果的验证.corrperm包提供了有重复测量的相 ...

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

    C#高级编程9-第12章 动态语言扩展 dynamic t = new ExpandoObject(); t.Abc = "abc"; t.Value = ; Console.Wr ...

  7. R in action读书笔记(19)第十四章 主成分和因子分析

    第十四章:主成分和因子分析 本章内容 主成分分析 探索性因子分析 其他潜变量模型 主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分.探索性因 ...

  8. 【读书笔记】C#高级编程 第十九章 程序集

    (一)程序集的含义 程序集是.NET用于部署和配置单元的术语. .NET应用程序包含一个或多个程序集.通常扩展名是EXE或DLL的.NET可执行程序称为程序集. 程序集是自我描述的安装单元,由一个或多 ...

  9. 【读书笔记】C#高级编程 第二十五章 事务处理

    (一)简介 事务的主要特征是,任务要么全部完成,要么都不完成. (二)概述 事务由事务管理器来管理和协调.每个影响事务结果的资源都由一个资源管理器来管理.事务管理器与资源管理器通信,以定义事务的结果. ...

随机推荐

  1. RabbitMD大揭秘

    RabbitMD大揭秘 欢迎关注H寻梦人公众号 通过SpringBoot整合RabbitMQ的案例来说明,RabbitMQ相关的各个属性以及使用方式:并通过相关源码深刻理解. Queue(消息队列) ...

  2. MySQL通过binlog日志恢复数据

    一.查看下自己的MySQL是否开启了binlog日志 # 是否启用binlog日志 OFF:关闭 ON:开启 show variables like 'log_bin'; 二.开启binlog日志 在 ...

  3. Graphics2D类

    Graphics2D类 Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供.坐标转换.颜色管 ...

  4. letsencrypt更换pip源

    vim letsencrypt-auto 将DEFAULT_INDEX_BASE = 'https://pypi.python.org'改为DEFAULT_INDEX_BASE = 'http://m ...

  5. APISpace 尾号限行API接口 免费好用

    尾号限行是一种为了缓解城市交通压力而催生的交通制度,措施实施以后对城市交通拥堵起到缓解作用.每个地区的尾号限行规定都有所不同,具体的以当地的为准.   尾号限行API,提供已知所有执行限行政策的共计6 ...

  6. Note -「Dsu On Tree」学习笔记

    前置芝士 树连剖分及其思想,以及优化时间复杂度的原理. 讲个笑话这个东西其实和 Dsu(并查集)没什么关系. 算法本身 Dsu On Tree,一下简称 DOT,常用于解决子树间的信息合并问题. 其实 ...

  7. 【Azure 事件中心】Azure Event Hub 新功能尝试 -- 异地灾难恢复 (Geo-Disaster Recovery)

    问题描述 关于Event Hub(事件中心)的灾备方案,大多数就是新建另外一个备用的Event Hub,当主Event Hub出现不可用的情况时,就需要切换到备Event Hub上. 而在切换的过程中 ...

  8. 丽泽普及2022交流赛day22 无社论

    开始掉分模式 . T3 有人上费用流了???(id) 不用 TOC 了 . T1 暴力 T2 没看见 任意两圆不相交,gg 包含关系容易维护,特判相切 . 单调栈即可 T3 贪心 T4 神秘题

  9. css基础04

    所有浮动都是贴着浮动的.一左一右的话就毫无联系了. 浮动元素和标准流是两个级别了,浮起来了,后面的人会补上空缺的位置,让其他标准流的盒子占有. 很容易形成叠加效果,(蓝色的标准流会上去补上浮动的位置, ...

  10. PHP切割汉字

    <?php /* @UTF-8编码的字符可能由1~3个字节组成. */ /*--------------------------方法一截取中文字符串方法--------------------- ...