教你在你的應用程序中擴展使用dynamic類型


教你在你的應用程序中擴展使用dynamic類型

    相信大家在開發中經常會接觸到mvc中的ViewBag,有心的同學會,發現這就是一個dynamic類型,查看源碼一談究竟,本文也是根據dynamic來擴展一些實際中的應用,方便開發過程中使用,來提高大家的工作效率等。這里我給大家介紹一個簡單的,解析xml的擴展類。

  先新建一個類,DynamicXmlNode 繼承自DynamicObject,然后我們輸入override,看一下,都有哪些方法可以重寫的:

  

  看到其中有2個方法,感覺很接近我們要用的,我這里只有TryGetMember,這個方法,我們重寫這個方法,在重寫之前,我們建立一個字典類,然后TryGetMember方法里面,用來操作這個字典類:  

 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方法,此時類就如下:  

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,綁定數據:

 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。

下面我們來調用:

 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這個類了。

好了,看下輸出結果:

好了,要去吃飯了,謝謝大家。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM