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. 如何在DIV内只要垂直滚动条,不要水平滚动条

    <DIV style="OVERFLOW-Y: scroll; OVERFLOW-X:hidden; width: 685px; height: 180px">< ...

  2. 吴恩达《Machine Learning Yearning》总结(31-40章)

    31.解读学习曲线:其他情况 下图反映了高方差,通过增加数据集可以改善. 下图反映了高偏差和高方差,需要找到一种方法来同时减少方差和偏差. 32.绘制学习曲线 情况:当数据集非常小时,比如只有100个 ...

  3. 51nod 1245 Binomial Coefficients Revenge

    Description C(M,N) = M! / N! / (M - N)! (组合数).给出M和质数p,求C(M,0), C(M,1)......C(M,M)这M + 1个数中,有多少数不是p的倍 ...

  4. Windows映射网络驱动器提示错误

    问题描述:Windows映射网络驱动器的时候,提示文件和打印机共享资源处于联机状态未对连接尝试检测到做出响应 解决方法:不同情况可能不一样,我的原因是,映射的Linux,防火墙处于开启状态,关闭了就可 ...

  5. [转]Show parameter & Table Not exists

    本文转自:http://www.cnblogs.com/fangwenyu/archive/2011/01/06/1926774.html 问题描述 在尝试通过show parameter来查看一个参 ...

  6. java版两人聊天程序

    server.java import java.io.*; import java.net.*; import java.text.SimpleDateFormat; import java.util ...

  7. flask在centos下搭建web服务【uwsgi,nginx】

    centos操作系统 uWSGI是一个web服务器,Nginx进行反向代理的其实跟这些服务器可以说没有任何关系,你提供动态内容的服务器可以是apache/nginx/tomcat,当然也可以是uWSG ...

  8. springboot从入门到精通(二)

    这一节我们一起用springboot开发一个应用程序,应用程序里的核心概念是玩家获取英雄列表上的英雄信息. 1.定义实体模型: 代码如下: package com.dota.herolist.enti ...

  9. Protocol Buffers教程

    今天想比较下pb和fastjson两个序列化后的大小.再看了一下pb序列化 pb官网:https://developers.google.com/protocol-buffers/ pb是啥 What ...

  10. C++里创建 Trie字典树(中文词典)(二)(插入、查找、导入、导出)

    萌新做词典第二篇,做得不好,还请指正,谢谢大佬! 做好了插入与遍历功能之后,我发现最基本的查找功能没有实现,同时还希望能够把内存的数据存入文件保存下来,并可以从文件中导入词典.此外,数据的路径是存在配 ...