C#4.0 System.Dynamic
System.Dynamic 命名空间提供支持动态语言运行时的类和接口。
代码下载地址:GitHub
本篇主要讲两个类:①ExpandoObject ②DynamicObject (重点)
①ExpandoObject
下面分别是XML和ExpandoObject设置与取值
对于集合:
XML和ExpandoObject各有各的好,把他们看做朋友关系,而ExpandoObject很容易转化为Dictionary类型。我们利用DynamicObject这个类来升级,转化为真正的动态类。
②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的更多相关文章
- Net 4.0 之 Dynamic 动态类型
Net 4.0 之 Dynamic 动态类型 本文主要旨在与网友分享.Net4.0的Dynamic 对Duck Type 的支持. 一..net4.0主要新特性 .Net4.0在.Net3.5 ...
- C#基本语法 - .Net 4.0 之 Dynamic 动态类型
一..net4.0主要新特性 .Net4.0在.Net3.5基础上新增的主要特性有:可选参数.命名参数和Dynamic.具体请阅生鱼片的这篇博文.这里我们着重讲解C#4.0的Dynamic特性,对 ...
- (转载)【C#4.0】dynamic和var及object
dynamic a = 10;a = a + 10;Console.WriteLine(a.GetType()); 此段代码会输出 System.Int32,第二行不需要类型转换,因为在运行时识别类型 ...
- 利用.net4.0的dynamic特性制造的超级简单的微信SDK
1.基础支持API /*-------------------------------------------------------------------------- * BasicAPI.cs ...
- System.Dynamic.ExpandoObject 类型的简单使用
该类型可以实现的是动态添加属性和移除属性,有点类似 js 中对象的操作,非常灵活 static void Main(string[] args) { dynamic obj = new System. ...
- 找不到方法:"!!0[] System.Array.Empty()".
找不到方法:"!!0[] System.Array.Empty()". 这个原因是没装.net framework 4.6
- Eclipse maven工程 Missing artifact com.sun:tools:jar:1.5.0:system 解决方法
今天同事在使用eclipse,引入一个新的maven工程时报错: Missing artifact com.sun:tools:jar:1.6.0:system 这个问题很奇怪,相同的代 ...
- 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 ...
- Method not found: !!0[] System.Array.Empty()错误
最近由于公司项目需要将之前支持的TLS1.0改成更安全的TLS1.2,而公司现有项目都是老系统,有的是.NET FrameWork 4.0,有的是.NET FrameWork3.5,但是TLS1.2默 ...
随机推荐
- pat02-线性结构1. Reversing Linked List (25)
02-线性结构1. Reversing Linked List (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, ...
- Oracle服务器重命名
转载自:http://www.codesec.net/view/120387.html 因工作需要准备了一台服务器专门按照oracle数据库,并且服务器上安装了windows 2008R2操作系统,在 ...
- [转]ASP.NET Core Exception Filters and Resource Filters
本文转自:https://damienbod.com/2015/09/30/asp-net-5-exception-filters-and-resource-filters/ This article ...
- sql server数据库打不开
- tushare获取的数据与mysql数据库交互简单范例
#!/usr/bin/python2.7# -*- coding: UTF-8 -*- import tushare as tsimport pandas as pdfrom sqlalchemy i ...
- stark——查看页面编辑删除按钮
一.数据列表 设计查页面,主要展示两部分内容,表头部分和数据部分, 表头通过遍历list_display和默认要显示的编辑和删除字段. 1.数据构建 (1)service/stark.py,后台数据构 ...
- javascript统计一个字符在一段字符串出现次数
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" ...
- CSS动画效果
CSS变形效果 Transform translate:平移 translate(x,y) translateX(x) translateY(y)相对于元素原始位置平移. scale:缩放 大于1放大 ...
- js时间与时间戳之间的转换操作,返回天、小时、分,全家桶
1.将时间戳转换成时间 var formatDate = function(d) { var now = new Date(d); var year = now.getFullYear(); var ...
- jar命令使用介绍
http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/jar.html Skip to Content Oracle Technol ...