(一)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 }

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

最新文章

  1. IOS 开发小技巧总结
  2. 修改Windows Server 2008密码策略,设置简单密码
  3. EntityFramework Code First 手写代码实现生成数据库
  4. 源码解读—HashTable
  5. 【SSM 2】spring常用注解
  6. CUDA入门1
  7. 在HTML5规范中div中读取预存的data-[key]值
  8. hadoop(三):hdfs 机架感知
  9. nodejs开发阶段利器supervisor
  10. vim显示历史命令
  11. compass做雪碧图
  12. dao 获取表最大排序实现
  13. [ofbiz]screen中应用form和ftl,控制页面元素属性
  14. java程序连接MongoDB副本集测试
  15. XAF-Domain Components 技术 使用接口来定义ORM业务对象
  16. zencart里常用 SQL
  17. JS中事件绑定的三种方式
  18. Java scirpt简介
  19. SQL SERVER 2016研究五
  20. python3-知识扩展扫盲易忘-zip的用法

热门文章

  1. Obsidian基础教程
  2. 从一道算法题实现一个文本diff小工具
  3. 重磅硬核 | 一文聊透对象在 JVM 中的内存布局,以及内存对齐和压缩指针的原理及应用
  4. for增强
  5. 一个豆瓣电影Top250爬虫
  6. Solution -「Local 11145」诗意狗
  7. .Net CLR R2R编译的原理简析
  8. logstash在windows系统下的安装与使用
  9. salt stack学习笔记
  10. SkiaSharp 之 WPF 自绘 拖曳小球(案例版)