教你在你的应用程序中扩展使用dynamic类型node
相信你们在开发中常常会接触到mvc中的ViewBag,有心的同窗会,发现这就是一个dynamic类型,查看源码一谈究竟,本文也是根据dynamic来扩展一些实际中的应用,方便开发过程当中使用,来提升你们的工做效率等。这里我给你们介绍一个简单的,解析xml的扩展类。mvc
先新建一个类,DynamicXmlNode 继承自DynamicObject,而后咱们输入override,看一下,都有哪些方法能够重写的:ide
看到其中有2个方法,感受很接近咱们要用的,我这里只有TryGetMember,这个方法,咱们重写这个方法,在重写以前,咱们创建一个字典类,而后TryGetMember方法里面,用来操做这个字典类: spa
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方法,此时类就以下: 3d
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); } }
其实很简单,相信同窗们都能看懂。这样一个动态类型就建立完成了,下面咱们就要用这个类,来封装数据,方便调用的人直接获取数据:code
建立一个类,定义一个静态方法,用来解析xml,绑定数据: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。对象
下面咱们来调用:blog
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这个类了。继承
好了,看下输出结果:
好了,要去吃饭了,谢谢你们。