DynamicObject和ExpandoObject

1.ExpandoObject表示一个对象,该对象包含可在运行时动态添加和移除的成员.这个类和动态类型有关,这个类能做些什么?

案例:

//ExpandoObject这个类需要引入System.Dynamic;

dynamic dynEO = new ExpandoObject();

dynEO.number = 20;

dynEO.Method = new Func<int, string>((int i) => { return (i + 20).ToString(); });

Console.WriteLine(dynEO.number);

Console.WriteLine(dynEO.Method(dynEO.number));

Console.ReadKey();

ExpandoObject这个累还是很有用的,他可以动态的添加成员和方法,这样我们就可以在写一些对象时,不需要在new一个class那么麻烦,只要这个类就OK了,不过有一点要注意,这个类时在运行时解析的,这样我们就会带来性能上的一些损失,而且,程序的逻辑复杂性越高,越难发现问题所在,所以,对于简单的对象,我们可以使用这个类,复杂的就不要使用了.

2.DynamicObject

DynamicObject跟ExpandoObject最大的区别就是,我们可以通过继承DynamicObject,自己来决定动态对象如何执行.咱先来看一下DynamicObject的定义中初始化函数:

public class DynamicObject:IDynamicObjectProvider

{

protected DynamicObject();

}

可以看到的是我们不可以对DynamicObject直接实例化,这也是DynamicObject设计的初衷,有我们自己来决定运行时的动态的成员的处理.一般的时候如果我们自定义的类型只需要处理一些动态的属性的时候我们只需要重写TryGetMember和TrySetMember这两个方法.

using System;

using System.Collections.Generic;

using System.Dynamic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Dynamic和Expando

{

class Program

{

static void Main(string[] args)

{

dynamic employee = new Test();

employee.Name = "zhangsan";

employee.Age = "22";

employee.Sex = "Man";

Console.WriteLine("name : {0} , age = {1} , sex = {2}",employee.Name,employee.Age,employee.Sex);

Console.ReadKey();

}

}

public class Test : DynamicObject

{

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

/*

* 这里重写TryGetMember和TrySetMember方法,继承了DynamicObject后,

* 可以override一大堆TryXXX的方法了

*/

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

{

var name = binder.Name;

Console.WriteLine("获取 {0}",name);

return dic.TryGetValue(name, out result);

}

public override bool TrySetMember(SetMemberBinder binder, object value)

{

var name = binder.Name;

dic[name] = value;

Console.WriteLine("写入 {0} = {1}",name,value);

return true;

}

}

}

我们还可以重写DynamicObject中的其他许多方法,实现我们动态运行时的操作.通过重写里面的方法实现我们动态运行时的自定义操作,这样我们可以更多的趋势线自己的一些动态的组件.

我是个比较啰嗦的人,我觉得有必要去分析一下冲下的那两个方法:TryGetMember和TrySetMember

TrySetMember方法:为设置成员值的操作提供实现.从DynamicObject类派生的类可以重写此方法,以便为诸如设置属性值这样的操作指定动态行为.

TryGetMember方法:提供了实现的操作得到成员的值.继承DynamicObject的类可以覆盖这个方法来制定动态行为等操作得到一个属性的值.

简单说,TryGetMember得到值,TrySetMember设置值.

TryGetMember(GetMemberBinder binder, out object result) 方法实现对数据的获取,binder.Name就是获取的属性的名称,result是获取的属性值.通过binder.Name在Data中获取到对应的属性值,传出到外面(能看到result是out参数)

TrySetMember(SetMemberBinder binder, object value) 对存在的属性进行赋值.

C#编程(七十二)----------DynamicObject和ExpandoObject的更多相关文章

  1. “全栈2019”Java第七十二章:静态内部类访问外部类成员

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. TNFE-Weekly[第七十二周已更新]

    前端行业发展飞速,新技术如雨后春笋般快速出现,尤其是各种小程序陆续推出,相关的信息.文章也铺天盖地的遍布在各处,我们有时候会困惑,不知道哪些信息对于自己是有价值的,那么TNFE-腾讯新闻前端团队启动了 ...

  3. 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

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

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

  5. Linux网络编程学习(十二) ----- 结语

    该书提前看完了,重点看了第四章和第六章,第七章以后只是大致浏览了一下,如果以后工作中涉及这一块再仔细研究一下,大概花了二十天的样子,主要了解了进程间的通信方式.socket编程以及五种I/O模式,看的 ...

  6. 通过Socket实现TCP编程(十二)

    原文链接:https://www.cnblogs.com/hysum/p/7531529.html Socket通信 : TCP协议是面向对象连接.可靠的.有序的,以字节流的方式发送数据. 基于TCP ...

  7. OpenCV开发笔记(七十二):红胖子8分钟带你使用opencv+dnn+tensorFlow识别物体

    前言   级联分类器的效果并不是很好,准确度相对深度学习较低,本章使用opencv通过tensorflow深度学习,检测已有模型的分类.   Demo       可以猜测,1其实是人,18序号类是狗 ...

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

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

  9. salesforce零基础学习(七十二)项目中的零碎知识点小总结(一)

    项目终于告一段落,虽然比较苦逼,不过也学到了好多知识,总结一下,以后当作参考. 一.visualforce标签中使用html相关的属性使用 曾经看文档没有看得仔细,导致开发的时候走了一些弯路.还好得到 ...

随机推荐

  1. JVM指令详解(上)

    指令码    助记符                            说明 0x00         nop                                什么都不做 0x01  ...

  2. java 异常的限制

    一. 1.) 在覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常 2.) 在基类构造器声明的异常,在子类必须抛出,子类的构造器可以抛出任何异常,但是必须抛出基类构造器的异常 3.) 在基类 ...

  3. tensorflow-训练(train)/测试(test)

    一个TFRecords 文件为一个字符串序列.这种格式并非随机获取,它比较适合大规模的数据流,而不太适合需要快速分区或其他非序列获取方式. 操作组 操作 Training Optimizers,Gra ...

  4. 基于bootstrap的上传插件fileinput实现ajax异步上传功能(支持多文件上传预览拖拽)

    首先需要导入一些js和css文件 ? 1 2 3 4 5 6 <link href="__PUBLIC__/CSS/bootstrap.css" rel="exte ...

  5. Linux 安装操作系统标准

    一.注意事项. 1.虚拟机安装不做过多介绍. 2.若为主机(非服务器)安装需要按照如下步骤: a.首先需要将u盘刻录pe系统然后设置开机引导为u盘启动后进入,将以前的硬盘分区全部删除. b.若主机bi ...

  6. django邮件

    1.邮件变量 (django settings.py) ADMINS = [('JOHN','JOHN@example.com'),('zhang','zhang@example.com')] #设置 ...

  7. [代码审计]云ec电商系统代码审计

    0x00 前言 看了一下博客内最新的文章,竟然是3月28号的,一个多月没写文章了,博客都长草了. 主要是临近毕业,事情繁多,也没有啥时间和心情静下来写.. 不过现在的话,毕业的东西告一段落了,几乎没啥 ...

  8. WEP保护帧移除工具airdecloak-ng

    WEP保护帧移除工具airdecloak-ng   为了防止WEP加密数据被破解,WIPS(无线入侵防御系统)会发送WEP保护帧.攻击者抓取WEP数据包时,也会获取这一类包,导致破解失败.aircra ...

  9. BZOJ.4355.Play with sequence(线段树)

    题目链接 问题在于操作二.操作二可以拆分成:区间加\(C\).区间(对\(0\))取\(\max\). 注意到操作一的\(C\)都是非负数,即数列中不会出现负数,所以我们直接维护最小值和最小值出现的次 ...

  10. HDU 5836 Rubik's Cube BFS

    Rubik's Cube 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5836 Description As we all know, Zhu is ...