教你在你的应用程序中扩展使用dynamic类型

教你在你的应用程序中扩展使用dynamic类型

    相信大家在开发中经常会接触到mvc中的ViewBag,有心的同学会,发现这就是一个dynamic类型,查看源码一谈究竟,本文也是根据dynamic来扩展一些实际中的应用,方便开发过程中使用,来提高大家的工作效率等。这里我给大家介绍一个简单的,解析xml的扩展类。

  先新建一个类,DynamicXmlNode 继承自DynamicObject,然后我们输入override,看一下,都有哪些方法可以重写的:

  

  看到其中有2个方法,感觉很接近我们要用的,我这里只有TryGetMember,这个方法,我们重写这个方法,在重写之前,我们建立一个字典类,然后TryGetMember方法里面,用来操作这个字典类:  

 1 public class DynamicXmlNode : DynamicObject
 2     {
 3         Dictionary<string, object> _objects = new Dictionary<string, object>();
 4
 5         public override bool TryGetMember(GetMemberBinder binder, out object result)
 6         {
 7             var name = binder.Name;
 8             return _objects.TryGetValue(name, out result);
 9         }
10
11
12     }

    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,绑定数据:

 1 public class CreateDynamicObj
 2     {
 3         public static List<DynamicXmlNode> CreateObj(string xml, string nodeName)
 4         {
 5             List<DynamicXmlNode> xmlNodes = new List<DynamicXmlNode>();
 6             var doc = XDocument.Parse(xml);
 7             var nodes = doc.Descendants(nodeName);
 8             foreach (var node in nodes)
 9             {
10                 //元素
11                 if (node.HasElements)
12                 {
13                     var nnodes = node.Elements();
14                     DynamicXmlNode xmlobj = new DynamicXmlNode();
15                     foreach (var nnode in nnodes)
16                     {
17                         var name = nnode.Name.LocalName;
18                         var b = nnode.Value;
19                         xmlobj.Add(name, b);
20                     }
21                     xmlNodes.Add(xmlobj);
22                 }
23                 //属性
24                 if (node.HasAttributes)
25                 {
26                     var nnodes = node.Attributes();
27                     DynamicXmlNode xmlobj = new DynamicXmlNode();
28                     foreach (var nnode in nnodes)
29                     {
30                         var name = nnode.Name.LocalName;
31                         var b = nnode.Value;
32                         xmlobj.Add(name, b);
33                     }
34                     xmlNodes.Add(xmlobj);
35                 }
36
37             }
38             return xmlNodes;
39         }
40 }

代码很简单了,大家应该都看的懂,传递一个要解析的节点名称,然后返回这个名称的所有元素,下面元素的名字或属性的名字做为键,值做为字典的值,调用DynamicXmlNode的Add方法,将键和值添加到字典中,并返回这个动态类型的集合。我这里只是简单示范了,如果同学们想让这个类更方便更适用,可以将节点解析改为递归的,这样才能适合各种格式的xml。

下面我们来调用:

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var xml = @"<root>
 6                             <item>
 7                                 <name>小王</name>
 8                                 <age>13</age>
 9                                 <sex>男</sex>
10                                 <friend>
11
12                                 </friend>
13                             </item>
14                             <item>
15                                 <name>小张</name>
16                                 <age>13</age>
17                                 <sex>女</sex>
18                             </item>
19                         </root>";
20
21             var objs = CreateDynamicObj.CreateObj(xml,"item");
22             foreach (dynamic dynamicXmlNode in objs)
23             {
24                 Console.WriteLine(dynamicXmlNode.name);
25                 Console.WriteLine(dynamicXmlNode.age);
26                 Console.WriteLine(dynamicXmlNode.sex);
27             }
28             Console.ReadKey();
29         }
30     }

大家可以看到,我foreach的对象是一个dynamic的类型,这样我就可以通过一个匿名属性直接获取该属性的值了,类似这个样子:dynamicXmlNode.name,而实际上我这个类型中是没用这个属性的,那就多亏了GetMemberBinder这个类了。

好了,看下输出结果:

好了,要去吃饭了,谢谢大家。

教你在你的应用程序中扩展使用dynamic类型

时间: 2024-11-07 20:31:45

教你在你的应用程序中扩展使用dynamic类型的相关文章

hadoop-初学者写map-reduce程序中容易出现的问题 3

1.写hadoop的map-reduce程序之前所必须知道的基础知识: 1)hadoop map-reduce的自带的数据类型: Hadoop提供了如下内容的数据类型,这些数据类型都实现了WritableComparable接口,以便用这些类型定义的数据可以被序列化进行网络传输和文件存储,以及进行大小比较.(如果是自定义的key,value的数据类型,必须也要写其大小比较的方法) BooleanWritable:标准布尔型数值 ByteWritable:单字节数值 DoubleWritable:

win32控制台应用程序中使用CString类型的方法

环境:win7 64位  + vs2010 一直在找,MFC不懂真没办法,顺便记住.... 新建win32控制台应用程序中不能使用cstring类型,此时包含头文件#include <afxwin.h>,并在项目属性->配置属性->常规 "项目默认值"->"MFC的使用"中选择"在静态库中使用MFC"或者"在共享DLL中使用MFC"即可

让你提前认识软件开发(21):C程序中的定时器

第1部分 重新认识C语言 C程序中的定时器 [文章摘要] 在实际的C程序中,一个模块执行多个操作是很常见的事情.如果多个操作同时进行,会出现程序效率低下.计算机CPU占用率过高等情况,这时就需要对所有操作的执行顺序作一个合理的安排,这就涉及到定时器的使用. 本文对C程序中的定时器的类型.设置和清除方法等作了详细的介绍,为相关开发工作的开展提供了参考. [关键词] C程序  定时器  操作  开发 一.定时器的定义及分类 我们所熟悉的定时器是一个多任务定时提醒的软件,安装于电脑或手机上.举个例子,

正确的Java学习线路图原来是这样,教你如何成为优秀的程序员

IT行业现在正处于火热的阶段,很多人面对就业这个难题迷惘之后选择了程序员的道路,java作为其中一个大的板块受到了很多学员的青睐,那么如何正确的学习java呢?千锋长沙的老师来给大家分析一下正确的java学习路线,教你教你如何成为优秀的程序员! 首先务必要在学好基础(比如计算机系统.算法.编译原理等等)的前提下,再考虑去进行下面的学习.Java基础首先去找一个Java的基础教程学一下,这里可以推荐一个地址,或者你也可以参照这个地址上去找相应的视频.学习Java基础的时候,应该尽量多动手,很多时候

浅谈高大上的微信小程序中渲染html内容—技术分享

大部分Web应用的富文本内容都是以HTML字符串的形式存储的,通过HTML文档去展示HTML内容自然没有问题.但是,在微信小程序(下文简称为「小程序」)中,应当如何渲染这部分内容呢? 解决方案 wxParse 小程序刚上线那会儿,是无法直接渲染HTML内容的,于是就诞生了一个叫做「 wxParse 」的库.它的原理就是把HTML代码解析成树结构的数据,再通过小程序的模板把该数据渲染出来. rich-text 前端精品教程:百度网盘下载 后来,小程序增加了「rich-text」组件用于展示富文本内

在Android程序中使用已有的SQLite数据库

已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com 在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的数据库的文章,于是在谷歌上找到这篇英文文章,依照它的步骤,測试成功.决定把这篇文章大致的翻译一下,想看原文的能够点击这里:http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ .

通过学习学生信息管理系统软件,C程序中,如何设计和编写一个应用系统?

1 从文件操作角度分析. 文件的概念以及文件类型指针 在c语言中,文件被看成是由一个一个的字符或字节组成的.根据数据的组织形式,文件可分为文本文件和二进制文件两种. 文本文件又被称为ASCII文件,文本文件在磁盘中存放时每个字符对应一个字节,用于放其对应的ASCII码.文本文件可在屏幕上按字符显示. 二进制文件时将数据转换成二进制形式然后存储起来的文件.二进制文件虽然也可在屏幕上显示,但其内容无法读懂. 文件指针是一中结构体类型变量,c编译系统已将结构定义好,并命名为FILE,我们直接用定义就好

C程序中让两个不同版本的库共存

原文连接:http://blog.gotocoding.com/archives/875 今天有同学提出,如何在一个C程序中让两个不同版本的库共存. 首先想到的方案是,把其中一个版本的库函数全部重命名,比如把每一个函数名都加一个_v2的后缀. 人工替换到没什么,但是如果函数个数超过10个,就有点不拿人当人使了. 而使有工具去替换就会遇到一些棘手的问题,如何识别哪些是函数,哪些是系统函数(系统函数不需要添加后缀)等. 随后想到的另一个解决方案是C++的方案,为其中一个版本库中的所有文件添加命名空间

在DevExpress程序中使用GridView直接录入数据的时候,增加列表选择的功能

在我上篇随笔<在DevExpress程序中使用Winform分页控件直接录入数据并保存>中介绍了在GridView以及在其封装的分页控件上做数据的直接录入的处理,介绍情况下数据的保存和校验等操作,不过还没有涉及到数据列表选择的这种方式,而这种在项目应用也是比较广泛的一种输入方式.本篇随笔继续探讨在GridView上直接录入数据,并增加字典选择列表的功能. 1.GridView直接录入数据回顾 在之前整合的数据录入案例里面,我们可以看到可以在列表里面直接录入速度的便捷性,如下所示. 1)直接在G