首页 技术 正文
技术 2022年11月18日
0 收藏 412 点赞 3,762 浏览 2479 个字

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

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

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

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

  看到其中有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类型

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,903
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,429
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,245
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,057
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,689
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,726