System.Dynamic 命名空间提供支持动态语言运行时的类和接口。

代码下载地址:GitHub

本篇主要讲两个类:①ExpandoObject   ②DynamicObject  (重点)

①ExpandoObject

参考:https://blogs.msdn.microsoft.com/csharpfaq/2009/09/30/dynamic-in-c-4-0-introducing-the-expandoobject/

下面分别是XML和ExpandoObject设置与取值

对于集合:

XML和ExpandoObject各有各的好,把他们看做朋友关系,而ExpandoObject很容易转化为Dictionary类型。我们利用DynamicObject这个类来升级,转化为真正的动态类。

②DynamicObject    本篇的主人翁

参考:https://blogs.msdn.microsoft.com/csharpfaq/2009/10/19/dynamic-in-c-4-0-creating-wrappers-with-dynamicobject/

DynamicXML类:

 public class DynamicXml : DynamicObject  //不能直接实例化,我们只能继承它了
{
//可以根据具体需求来进行逻辑实现
public XElement xNode;
public DynamicXml(XElement node)
{
this.xNode = node;
} public DynamicXml()
{ } public DynamicXml(string name)
{
xNode = new XElement(name);
} /// <summary>
/// 设置值 实例化该类的时候就会进入改方法
/// </summary>
/// <param name="binder">动态设置成员操作</param>
/// <param name="value">值</param>
/// <returns></returns>
public override bool TrySetMember(SetMemberBinder binder, object value)
{
XElement setNode = xNode.Element(binder.Name);
if (setNode != null)//如果存在改节点
{
setNode.SetValue(value); //就直接赋值
}
else
{
if (value.GetType() == typeof(DynamicXml)) //如果值为动态就调用自己,知道值为确定类型
{
xNode.Add(new XElement(binder.Name));
}
else
{
xNode.Add(new XElement(binder.Name, value)); //添加节点
}
}
return true;
} //取值 实例化该类的时候就会进入改方法
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
XElement getNode = xNode.Element(binder.Name);
if (getNode != null)
{
result = new DynamicXml(getNode);
}
else
{
result = new DynamicXml(binder.Name); //result = null; 这是案例的返回值,如果这样我们做测试的时候Address就会为空,这里需要改一下
}
return true;
} public override bool TryConvert(ConvertBinder binder, out object result)
{
if (binder.Type == typeof(string))
{
result = xNode.Value;
return true;
}
else
{
result = null;
return false;
}
} public override bool TryInvokeMember(
InvokeMemberBinder binder, object[] args, out object result)
{
Type xmlType = typeof(XElement);
try
{
result = xmlType.InvokeMember(
binder.Name,
BindingFlags.InvokeMethod |
BindingFlags.Public |
BindingFlags.Instance,
null, this.xNode, args);
return true;
}
catch
{
result = null;
return false;
}
}
}

DynamicObjext和XML的转换

C#4.0 System.Dynamic的更多相关文章

  1. Net 4.0 之 Dynamic 动态类型

    Net 4.0 之 Dynamic 动态类型 本文主要旨在与网友分享.Net4.0的Dynamic 对Duck Type 的支持.     一..net4.0主要新特性 .Net4.0在.Net3.5 ...

  2. C#基本语法 - .Net 4.0 之 Dynamic 动态类型

      一..net4.0主要新特性 .Net4.0在.Net3.5基础上新增的主要特性有:可选参数.命名参数和Dynamic.具体请阅生鱼片的这篇博文.这里我们着重讲解C#4.0的Dynamic特性,对 ...

  3. (转载)【C#4.0】dynamic和var及object

    dynamic a = 10;a = a + 10;Console.WriteLine(a.GetType()); 此段代码会输出 System.Int32,第二行不需要类型转换,因为在运行时识别类型 ...

  4. 利用.net4.0的dynamic特性制造的超级简单的微信SDK

    1.基础支持API /*-------------------------------------------------------------------------- * BasicAPI.cs ...

  5. System.Dynamic.ExpandoObject 类型的简单使用

    该类型可以实现的是动态添加属性和移除属性,有点类似 js 中对象的操作,非常灵活 static void Main(string[] args) { dynamic obj = new System. ...

  6. 找不到方法:"!!0[] System.Array.Empty()".

    找不到方法:"!!0[] System.Array.Empty()". 这个原因是没装.net framework 4.6

  7. Eclipse maven工程 Missing artifact com.sun:tools:jar:1.5.0:system 解决方法

    今天同事在使用eclipse,引入一个新的maven工程时报错:      Missing artifact com.sun:tools:jar:1.6.0:system   这个问题很奇怪,相同的代 ...

  8. pom文件miss artifact com.sun:tools:jar:1.5.0:system问题

    问题现象: 导入新的maven项目时,有时候pom.xml文件会提示一个错误信息:Missing artifact com.sun:tools:jar:1.5.0:system 问题原因: maven ...

  9. Method not found: !!0[] System.Array.Empty()错误

    最近由于公司项目需要将之前支持的TLS1.0改成更安全的TLS1.2,而公司现有项目都是老系统,有的是.NET FrameWork 4.0,有的是.NET FrameWork3.5,但是TLS1.2默 ...

随机推荐

  1. repoquery详解——linux查看包依赖关系的神器

    repoquery是yum扩展工具包yum-utils中的一个工具,所有如果你没有repoquery命令的话,可以先 sudo yum install yum-utils 安装yum-utils包.是 ...

  2. 腾讯蔡晨:十年沉淀,腾讯iOA为企业安全保驾护航

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 背景:5月23-24日,以"焕启"为主题的腾讯"云+未来"峰会再广州召开,广东省各级政府机构领导.海 ...

  3. 深入redis内部之redis启动过程之二

    接上文,继续分析代码 1. 设置线程安全模式 zmalloc_enable_thread_safeness();/*设置线程安全标识符为1*/ void zmalloc_enable_thread_s ...

  4. Beautiful Soup库介绍

    开始前需安装Beautiful Soup 和lxml. Beautiful Soup在解析时依赖解析器,下表列出bs4支持的解析器. 解析器 使用方法 Python标准库 BeautifulSoup( ...

  5. axios请求报Uncaught (in promise) Error: Request failed with status code 404

    使用axios处理请求时,出现的问题解决 当url是远程接口链接时,会报404的错误: Uncaught (in promise) Error: Request failed with status ...

  6. 06.do-while循环的练习

    练习1: namespace _09.do_while循环练习01 { class Program { static void Main(string[] args) { //计算1到100之间的整数 ...

  7. Jquery系列:textarea常用操作

    1.textarea内容的读取与设置 读textarea文本值可以用name和id.而写入文本值只能用id. <textarea name="content" id=&quo ...

  8. ssh命令使用

    ssh是什么 ssh是一种通信协议,用于与另一台计算机通信,有多个实现版本,openssh属于开源实现 usage: ssh [-B bind_interface] [-b bind_address] ...

  9. OLEDB不使用SQL语句直接打开数据表

    一般来说获取数据库表的方法是采用类似 select * from table_name 这样的sql语句.SQL语句必然伴随着数据库的解释执行,一般来说效率比较低下,而且使用SQL语句时需要数据库支持 ...

  10. linux内核编译与开发

    一.Linux内核简介linux kernel map: linux 系统体系结构: linux kernel体系结构: arm有7种工作模式,x86也实现了4个不同级别RING0-RING3,RIN ...