教你在你的应用程序中扩展使用dynamic类型
2014-06-13 12:06
429 查看
教你在你的应用程序中扩展使用dynamic类型
相信大家在开发中经常会接触到mvc中的ViewBag,有心的同学会,发现这就是一个dynamic类型,查看源码一谈究竟,本文也是根据dynamic来扩展一些实际中的应用,方便开发过程中使用,来提高大家的工作效率等。这里我给大家介绍一个简单的,解析xml的扩展类。
先新建一个类,DynamicXmlNode 继承自DynamicObject,然后我们输入override,看一下,都有哪些方法可以重写的:
看到其中有2个方法,感觉很接近我们要用的,我这里只有TryGetMember,这个方法,我们重写这个方法,在重写之前,我们建立一个字典类,然后TryGetMember方法里面,用来操作这个字典类:
GetMemberBinder就是获取数据的绑定名称,属性Name,就可以做为我们从字典中获取值的key,此时,获取值的方法已经写好了,那么我们要将数据绑定进来,对外提供一个Add方法,此时类就如下:
其实很简单,相信同学们都能看懂。这样一个动态类型就创建完成了,下面我们就要用这个类,来封装数据,方便调用的人直接获取数据:
创建一个类,定义一个静态方法,用来解析xml,绑定数据:
代码很简单了,大家应该都看的懂,传递一个要解析的节点名称,然后返回这个名称的所有元素,下面元素的名字或属性的名字做为键,值做为字典的值,调用DynamicXmlNode的Add方法,将键和值添加到字典中,并返回这个动态类型的集合。我这里只是简单示范了,如果同学们想让这个类更方便更适用,可以将节点解析改为递归的,这样才能适合各种格式的xml。
下面我们来调用:
大家可以看到,我foreach的对象是一个dynamic的类型,这样我就可以通过一个匿名属性直接获取该属性的值了,类似这个样子:dynamicXmlNode.name,而实际上我这个类型中是没用这个属性的,那就多亏了GetMemberBinder这个类了。
好了,看下输出结果:
好了,要去吃饭了,谢谢大家。
相信大家在开发中经常会接触到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这个类了。
好了,看下输出结果:
好了,要去吃饭了,谢谢大家。
相关文章推荐
- 使用异步Servlet扩展AJAX应用程序
- 使用异步Servlet扩展AJAX应用程序
- 使用异步Servlet扩展AJAX应用程序
- [转]使用Managed Extensibility Framework方便的扩展应用程序
- 使用Managed Extensibility Framework方便的扩展应用程序
- 使用域扩展interbase的数据类型
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterdivt_cast、和const_cast
- 使用Managed Extensibility Framework方便的扩展应用程序
- 使用异步Servlet扩展AJAX应用程序
- Delphi插件创建、调试与使用应用程序扩展
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。(转)
- 【转贴】使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast
- .net 3.0+关于实现IEnumerable的类型的扩展方法的使用一
- 使用 PHP 的 SimpleXML 扩展处理 YouTube 数据并将其集成到 PHP 应用程序中
- vs2008中让基于.net 2.0的应用程序也可以使用扩展方法
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。
- 面向 Java 开发人员的 Ajax: 使用 Jetty 和 Direct Web Remoting 编写可扩展的 Comet 应用程序
- Delphi 插件(Plug-ins)创建、调试与使用应用程序扩展(二)
- 使用Managed Extensibility Framework方便的扩展应用程序 推荐
- 使用异步Servlet扩展AJAX应用程序