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. 解决VMWARE 虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态

    VMWARE WORKSTATION 在安装64为操作系统报错,报错内容如图: 错误提示已经很清楚了,需要在BIOS 中打开intel VT-x g功能,开启此功能的前提是: 1.首先要确定的就是你的 ...

  2. 已知tomcat应用名称,如何查询该应用端口号

    假设应用名称叫pear,并假设路径为:/datong/tomcat-pear/ 方法一,根据PID查找应用端口号,前提是应用已经运行 1,找到改应用的PID:ps -ef | grep pear | ...

  3. 在nginx上部署django项目--------Gunicorn+Django+nginx+mysql

    一.安装nginx 以前的博客我有写,这里就不写了 http://www.cnblogs.com/wt11/p/6420442.html 二.安装mysql 我用的mysql5.7  64位的二进制包 ...

  4. 分支结构if……else

    语法: if(条件) 语句或语句块1 end else begin 语句或者语句块2 end 特点: . else并不一定是必须的. . 如否条件为真,将执行语句和语句块1,条件为假时执行语句或语句块 ...

  5. js中的Function和Object

    说到构造器(condtructor).原型链(prototype),说道Function与Object,总要祭出下面这张图 1.Function是最顶层的构造器,Object是最顶层的对象 2.先有的 ...

  6. Java集合篇三:Vector

    package com.test.collection; import java.util.Vector; public class MyVector { /** * @param args */ p ...

  7. TopcoderSRM679 Div1 250 FiringEmployees(树形dp)

    题意 [题目链接]这怎么发链接啊..... 有一个 \(n\) 个点的树,每个点有点权(点权可能为负) ,求包含点\(1\)的最 大权连通子图(的权值和) . \(n \leqslant 2500\) ...

  8. 测试css3的动画效果在display:none的时候不耗费性能

    也许你也有这个疑惑,动画一直在播放,那它不显示出来的时候也一直在播放的话,那是否一直占用资源呢? <!doctype html> <html> <head> < ...

  9. 搭建JUnit环境

    1.下载 JUnit,这里用JUnit 4.7 下载链接: http://pan.baidu.com/s/1c23n7LQ 密码: i18e 2.可以直接 build path 引入:也可以创建 Us ...

  10. 收缩事务日志(sqlserver)

    sqlserver数据库的日志文件其实是由很多个逻辑上的日志文件组成,我们可以通过命令看一下数据库日志文件 ​可以看到的是sqlserver数据库日志文件是由很多文件组成的,当数据库日志文件已满的时候 ...