【读书笔记】C#高级编程 第十二章 动态语言扩展
(一)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#高级编程 第十二章 动态语言扩展的更多相关文章
- 读书笔记 - js高级程序设计 - 第十二章 DOM2和DOM3
Node类型的变化 访问元素的样式 myDiv.style.backgroundColor = "red" myDiv.style.width = "100px& ...
- 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图
读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺 ...
- R in action读书笔记(16)第十二章 重抽样与自助法之 置换检验
第十二章:重抽样与自助法 本章,我们将探究两种应用广泛的依据随机化思想的统计方法:置换检验和自助法 12.1 置换检验 置换检验,也称随机化检验或重随机化检验. 有两种处理条件的实验,十个受试者已经被 ...
- 【读书笔记】C#高级编程 第二十二章 安全性
(一)身份验证和授权 安全性的两个基本支柱是身份验证和授权.身份验证是标识用户的过程,授权在验证了所标识用户是否可以访问特性资源之后进行的. 1.标识和Principal 使用标识可以验证运行应用程序 ...
- R in action读书笔记(17)第十二章 重抽样与自助法
12.4 置换检验点评 除coin和lmPerm包外,R还提供了其他可做置换检验的包.perm包能实现coin包中的部分功能,因此可作为coin包所得结果的验证.corrperm包提供了有重复测量的相 ...
- C#高级编程9-第12章 动态语言扩展
C#高级编程9-第12章 动态语言扩展 dynamic t = new ExpandoObject(); t.Abc = "abc"; t.Value = ; Console.Wr ...
- R in action读书笔记(19)第十四章 主成分和因子分析
第十四章:主成分和因子分析 本章内容 主成分分析 探索性因子分析 其他潜变量模型 主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分.探索性因 ...
- 【读书笔记】C#高级编程 第十九章 程序集
(一)程序集的含义 程序集是.NET用于部署和配置单元的术语. .NET应用程序包含一个或多个程序集.通常扩展名是EXE或DLL的.NET可执行程序称为程序集. 程序集是自我描述的安装单元,由一个或多 ...
- 【读书笔记】C#高级编程 第二十五章 事务处理
(一)简介 事务的主要特征是,任务要么全部完成,要么都不完成. (二)概述 事务由事务管理器来管理和协调.每个影响事务结果的资源都由一个资源管理器来管理.事务管理器与资源管理器通信,以定义事务的结果. ...
随机推荐
- UiPath官方视频Level1
[UiPath官方视频Level1]第一课-UiPath简介https://www.bilibili.com/video/BV1zJ41187vB [UiPath官方视频Level1]第二课-变量和数 ...
- JS 会有变量提升和函数提升
JavaScript变量函数声明提升(Hoisting)是在 Javascript 中执行上下文工作方式的一种认识(也可以说是一种预编译),从字面意义上看,"变量提升"意味着变量和 ...
- js基础学习-数组
let arr1 = [ {name: 1} ] let arr2 = [ {age: 23} ] let ages = [11, 22, 23] let newArr = arr1.concat(a ...
- 基于EasyExcel的大数据量导入并去重
源码:https://gitee.com/antia11/excel-data-import-demo 背景:客户需要每周会将上传一个 Excel 数据文件,数据量单次为 20W 以上,作为其他模块和 ...
- typescript中的esModuleInterop选项
当没有加esModuleInterop时 库的代码: export const a = 1; export default function b() {} 生成代码 exports.__esModul ...
- 零基础学Java(12)静态字段与静态方法
静态字段与静态方法 之前我们都定义的main方法都被标记了static修饰符,那到底是什么意思?下面我们来看看 静态字段 如果将一个字段定义为static,每个类只有一个这样的字段.而对于非静 ...
- go将青龙面板里面的脚本文件都下载到本地
纯粹练手用的,大家轻喷 青龙面板的脚本文件可以下载到本地,这样的话自己可以研究一下对应的脚本文件,能学到更多的知识,原理其实很简单,F12一下就知道了,青龙面板使用Request Headers里面放 ...
- inotify 目录文件变更实时监控
# inotify 软件 # 安装:通过epel,安装在客户端 # 功能:实时监控目录下文件的更变 # 监控事件:创建.删除.修改.移动... # 安装位置:客户端 # 安装命令: sudo apt- ...
- 常见SQL及备注
- Python 爬取途虎养车 全系车型 轮胎 保养 数据
Python 爬取途虎养车 全系车型 轮胎 保养 数据 2021.7.27 更新 增加标题.发布时间参数 demo文末自行下载,需要完整数据私聊我 2021.2.19 更新 增加大保养数据 2020. ...