项目中dynamic与xml的相互转换2013-11-28 JasenKin 项目中很多地方采用dynamic新特性进行开发,因此本人参看了很多关于dynamic的资料。在新的一年开始 ,记录下自己的学习经验。dynamic关键字用于声明一个动态对象,然后通过该动态对象去调用方法或 读写属性。(一)测试Alexandra Rusina提供的参考资料参考 http://blogs.msdn.com/b/csharpfaq/archive/2009/10/19/dynamic-in-c-4-0-creating-wrappers-with- dynamicobject.aspx ,因此对该地址的博文中DynamicXMLNode类进行相应的学习与测试。测试如下:
static void Main(string[] args){//正常运行RunDynamicXMLNode(true);//异常运行RunDynamicXMLNode(false); Console.ReadLine();}private static void RunDynamicXMLNode(bool state){Console.WriteLine("------RUN begin------");try{dynamic contact = new DynamicXMLNode("Contacts");contact.Name = "Patrick Hines";if (state){contact.Address = new DynamicXMLNode();}contact.Address.Street = "123 Main St";}catch (RuntimeBinderException ex){Console.WriteLine(ex.Message);}Console.WriteLine("------RUN end--------");}运行后显示结果如下:

设置断点进行单步调试,发现TryGetMember方法中:如果当前元素XElement下没有相应的XName的 子元素,那么result = null;正常运行contact.Address = new DynamicXMLNode();创建了一个新的 dynamic对象。反之,contact.Address =null;将导致RuntimeBinderException异常。
public override bool TryGetMember(GetMemberBinder binder, out object result){XElement getNode = node.Element(binder.Name);if (getNode != null){result = new DynamicXMLNode(getNode);return true;}else{result = null;return false;}}