教你在你的应用程序中扩展使用dynamic类型
教你在你的应用程序中扩展使用dynamic类型
相信大家在开发中经常会接触到mvc中的ViewBag,有心的同学会,发现这就是一个dynamic类型,查看源码一谈究竟,本文也是根据dynamic来扩展一些实际中的应用,方便开发过程中使用,来提高大家的工作效率等。这里我给大家介绍一个简单的,解析xml的扩展类。
先新建一个类,DynamicXmlNode 继承自DynamicObject,然后我们输入override,看一下,都有哪些方法可以重写的:
看到其中有2个方法,感觉很接近我们要用的,我这里只有TryGetMember,这个方法,我们重写这个方法,在重写之前,我们建立一个字典类,然后TryGetMember方法里面,用来操作这个字典类:
public class DynamicXmlNode : DynamicObject
{
Dictionary<string, object> _objects = new Dictionary<string, object>(); public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var name = binder.Name;
return _objects.TryGetValue(name, out result);
} }
GetMemberBinder就是获取数据的绑定名称,属性Name,就可以做为我们从字典中获取值的key,此时,获取值的方法已经写好了,那么我们要将数据绑定进来,对外提供一个Add方法,此时类就如下:
public class DynamicXmlNode : DynamicObject
{
Dictionary<string, object> _objects = new Dictionary<string, object>(); public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var name = binder.Name;
return _objects.TryGetValue(name, out result);
} public void Add(string name, object s)
{
_objects.Add(name, s);
}
}
其实很简单,相信同学们都能看懂。这样一个动态类型就创建完成了,下面我们就要用这个类,来封装数据,方便调用的人直接获取数据:
创建一个类,定义一个静态方法,用来解析xml,绑定数据:
public class CreateDynamicObj
{
public static List<DynamicXmlNode> CreateObj(string xml, string nodeName)
{
List<DynamicXmlNode> xmlNodes = new List<DynamicXmlNode>();
var doc = XDocument.Parse(xml);
var nodes = doc.Descendants(nodeName);
foreach (var node in nodes)
{
//元素
if (node.HasElements)
{
var nnodes = node.Elements();
DynamicXmlNode xmlobj = new DynamicXmlNode();
foreach (var nnode in nnodes)
{
var name = nnode.Name.LocalName;
var b = nnode.Value;
xmlobj.Add(name, b);
}
xmlNodes.Add(xmlobj);
}
//属性
if (node.HasAttributes)
{
var nnodes = node.Attributes();
DynamicXmlNode xmlobj = new DynamicXmlNode();
foreach (var nnode in nnodes)
{
var name = nnode.Name.LocalName;
var b = nnode.Value;
xmlobj.Add(name, b);
}
xmlNodes.Add(xmlobj);
} }
return xmlNodes;
}
}
代码很简单了,大家应该都看的懂,传递一个要解析的节点名称,然后返回这个名称的所有元素,下面元素的名字或属性的名字做为键,值做为字典的值,调用DynamicXmlNode的Add方法,将键和值添加到字典中,并返回这个动态类型的集合。我这里只是简单示范了,如果同学们想让这个类更方便更适用,可以将节点解析改为递归的,这样才能适合各种格式的xml。
下面我们来调用:
class Program
{
static void Main(string[] args)
{
var xml = @"<root>
<item>
<name>小王</name>
<age>13</age>
<sex>男</sex>
<friend> </friend>
</item>
<item>
<name>小张</name>
<age>13</age>
<sex>女</sex>
</item>
</root>"; var objs = CreateDynamicObj.CreateObj(xml,"item");
foreach (dynamic dynamicXmlNode in objs)
{
Console.WriteLine(dynamicXmlNode.name);
Console.WriteLine(dynamicXmlNode.age);
Console.WriteLine(dynamicXmlNode.sex);
}
Console.ReadKey();
}
}
大家可以看到,我foreach的对象是一个dynamic的类型,这样我就可以通过一个匿名属性直接获取该属性的值了,类似这个样子:dynamicXmlNode.name,而实际上我这个类型中是没用这个属性的,那就多亏了GetMemberBinder这个类了。
好了,看下输出结果:
好了,要去吃饭了,谢谢大家。
教你在你的应用程序中扩展使用dynamic类型的更多相关文章
- hadoop-初学者写map-reduce程序中容易出现的问题 3
1.写hadoop的map-reduce程序之前所必须知道的基础知识: 1)hadoop map-reduce的自带的数据类型: Hadoop提供了如下内容的数据类型,这些数据类型都实现了Writab ...
- 让你提前认识软件开发(21):C程序中的定时器
版权声明:本文为博主原创文章.对文章内容有不论什么意见或建议.欢迎与作者单独交流.作者QQ(微信):245924426. https://blog.csdn.net/zhouzxi/article/d ...
- 阿里P7级教你如何在Spring Boot应用程序中使用Redis
在Spring Boot应用程序中使用Redis缓存的步骤: 1.要获得Redis连接,我们可以使用Lettuce或Jedis客户端库,Spring Boot 2.0启动程序spring-boot-s ...
- 错误内存【读书笔记】C程序中常见的内存操作有关的典型编程错误
题记:写这篇博客要主是加深自己对错误内存的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 对C/C++程序员来讲,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的 ...
- 教你用shell写CGI程序
以前用shell写过一些cgi的例子.今天向大家介绍一下. CGI是一种接口的标准,并不区分编程语言,也就是说,CGI可以用任何一种语言编写,只要这种语言具有标准输入.输出和环境变量.CGI会将标准输 ...
- 微信小程序中的组件
前言 之前做小程序开发的时候,对于开发来说比较头疼的莫过于自定义组件了,当时官方对这方面的文档也只是寥寥几句,一笔带过而已,所以写起来真的是非常非常痛苦!! 好在微信小程序的库从 1.6.3 开始,官 ...
- C#:手把手教你用C#打包应用程序(安装程序卸载程序)
摘要:本文介绍在C#中手把手教你用C#打包应用程序(安装程序卸载程序) 1:新建安装部署项目 打开VS,点击新建项目,选择:其他项目类型->安装与部署->安装向导(安装项目也一样),然后点 ...
- 如何在程序中加入Growl通知
Growl for Windows – Mac 样式的信息提示工具.目前已经支持的软件包括:Outlook,Visual Studio 等以及一个利用命令行从本地或者远程发送消息过来的工具 .Grow ...
- 微信小程序中的自定义组件
微信小程序中的组件 前言 之前做小程序开发的时候,对于开发来说比较头疼的莫过于自定义组件了,当时官方对这方面的文档也只是寥寥几句,一笔带过而已,所以写起来真的是非常非常痛苦!! 好在微信小程序的库从 ...
随机推荐
- TexturePacker的使用
一.为什么要使用TexturePacker 这是应为我们做的游戏最终要运行在Android手机或者苹果手机上,而Android或者ios系统使用的是OpenGL ES来渲染.所以我们要针对OpenGL ...
- 谓词(NSPredicate)
OC中的谓词操作是针对于数组类型的,他就好比数据库中的查询操作,数据源就是数组,这样的好处是我们不需要编写很多代码就可以去操作数组,同时也起到过滤的作用,我们可以编写简单的谓词语句,就可以从数组中过滤 ...
- Java immutable class
可变类:类的实例创立之后,还可以修改这个实例的内容. 比如创建一个3*3的矩阵,如果设立了set function,在main中可以用set更改对应位置元素的大小. 不可变类:就是类的实例一旦被建立, ...
- 解决 kindle 书籍字体颜色偏淡问题的方法
现象 通过Markdown转换而来的mobi格式书籍都有一个大问题:字体偏淡,放在kindle上看对比度很差. 原因分析: 导致这种问题的原因,可能是因为在制作电子书的过程中,这些内容是被标注了彩色或 ...
- 【慕课网学习笔记】Java共享变量的可见性和原子性
1. Java内存模型(Java Memory Model, JMM) Java的内存模型如下,所有变量都存储在主内存中,每个线程都有自己的工作内存. 共享变量:如果一个变量在多个线程中都使用到了,那 ...
- 安卓数据存储(3):SQLite数据库存储
SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级:使用 SQLit ...
- 让你一分钟认识电子身份验证系统EID
什么是EID eID是英文"Electronic Identity"的英文简称,中文名为"电子身份证"或"网络电子身份证",由公安部第三研究 ...
- HeaderViewListAdapter cannot be cast to listAdapter问题原因及解决办法
[o] 在listView中添加leaderView 和footerView的时候要注意在setAdapter之前调用,不然会报如下异常: listAdapter cannot be cast to ...
- MVC Filter自定义验证(拦截)
namespace QS.Web.Extensions { /// <summary> /// 验证session.权限 状态 /// </summary> [Attribut ...
- swift 函数返回值
函数的定义及调用 func开头作为前缀,->返回的类型 add输出结果是11 函数参数也可以有多个参数,写在括号里用逗号隔开. func introduce(name: String,age: ...