教你在你的應用程序中擴展使用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這個類了。繼承
好了,看下輸出結果:
好了,要去吃飯了,謝謝你們。