精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

增強(qiáng)的XML?通過C# 4.0 dynamic享受Ruby寫法之探討

開發(fā) 后端
C# 4.0,dynamic新特性,XML。在.NET 4.0中開始可以自行設(shè)計一些API,開放了更多的發(fā)揮空間。本文介紹了通過一個自己的API實現(xiàn)Ruby寫法構(gòu)架XML的功能,對C# 4.0的dynamic特性給予了極高的評價。

Ruby語法的簡潔深為程序員們所喜愛,而寫C#的往往要忍受易用性很差的寫法。不過由于.NET 4.0的到來,C# 4.0新增的dynamic功能開放了更多的自己設(shè)計API的選擇,這樣就開啟了很多自由的編程道路。老趙在下面介紹了自己打造的一個Ruby Markup Builder,展示了其強(qiáng)大的XML構(gòu)造功能。

從.NET誕生之日起就有了XML類庫,但是從使用上來說非常不方便。例如我們需要構(gòu)造一個XML文檔時,使用DOM API就要這樣搞:

  1. var xmlDoc = new XmlDocument();  
  2. var rootEle = xmlDoc.CreateElement("persons");  
  3. xmlDoc.AppendChild(rootEle);  
  4.  
  5. var person1 = xmlDoc.CreateElement("person");  
  6. person1.InnerText = "Tom";  
  7. var person1Age = xmlDoc.CreateAttribute("age");  
  8. person1Age.Value = "10";  
  9. person1.Attributes.Append(person1Age);  
  10. rootEle.AppendChild(person1);  
  11.  
  12. var person2 = xmlDoc.CreateElement("person");  
  13. person2.InnerText = "Jerry";  
  14. var person2Age = xmlDoc.CreateAttribute("age");  
  15. person2Age.Value = "8";  
  16. person2.Attributes.Append(person2Age);  
  17. rootEle.AppendChild(person2);  
  18.  

別看這么多行代碼,但實際上它只構(gòu)造了這么簡單的一個XML:

  1. <persons> 
  2.   <person age="10">Tom</person> 
  3.   <person age="8">Jerry</person> 
  4. </persons> 

我承認(rèn),DOM API的確非常嚴(yán)謹(jǐn)(如XmlDocument和XmlElement的歸屬關(guān)系),非常符合定義,也非常的面向?qū)ο螅沁@易用性也實在太差了。記得在03還是04年的時候,我為在為項目做一個編輯XML文檔的WinForm應(yīng)用程序,當(dāng)時也不像現(xiàn)在那么容易想到“偷懶”的法門,而VS 2003也不像VS 2005/2008那么好用,因此可謂做的勞心費(fèi)神。這個情況在.NET 2.0中也沒有得到改變,直到有一天,LINQ to XML隨.NET 3.5橫空出世,于是乎XML的生活一下子變得美好了很多。例如上面的功能只需寥寥數(shù)行便可以實現(xiàn):

  1. var xmlDoc = new XElement("persons",  
  2.     new XElement("person",  
  3.         "Tom",  
  4.         new XAttribute("age", 10)),  
  5.     new XElement("person",  
  6.         "Jerry",  
  7.         new XAttribute("age", 8)));   

雖然LINQ to XML一直是所謂C# 3.0中LINQ特性的一部分,與LINQ to SQL,LINQ to Object及LINQ to……某個別的并列,但我始終認(rèn)為LINQ to XML實則還是LINQ to Object的一種特殊形式,只是它用于操作XML而已。它的一切都是System.Xml.Linq命名空間下相關(guān)類庫(如XElement)在起作用,不關(guān)LINQ什么事情。XElement等相關(guān)類型大大簡化了我們的開發(fā),與DOM API相比,無論是XML的構(gòu)造還是讀取都容易了許多。不過俗話說得好:“不怕不識貨,就怕貨比貨”,這樣的API與Ruby Markup Builder相比還是有明顯差距。請看:

  1. builder = Builder::XmlMarkup.new 
  2. xml = builder.persons { |b|  
  3.     b.person("Tom", :age => "10")  
  4.     b.person("Jerry", :age => "8")  
  5. }  

請看上面這段代碼,它自然沒有使用Ruby語言的標(biāo)準(zhǔn)著色方式。我著色的目的是體現(xiàn)這個構(gòu)造方式中的“噪音”——也就是與XML內(nèi)容無關(guān)的部分。從中可以發(fā)現(xiàn),Ruby不愧是一種噪音較少的語言,如果您嘗試使用這個方式來觀察C#中LINQ to XML的做法,就會發(fā)現(xiàn)兩者之間的確有明顯的差距。當(dāng)然,如果使用VB.NET的XML Literal可能噪音也很少,但是在我看來,XML Literal在XML構(gòu)造方面的表現(xiàn)有些羅嗦,例如它需要開發(fā)人員同時提供元素的開始標(biāo)簽和閉合標(biāo)簽,可能在IDE的幫助下此類代碼輸入較為簡單,但是代碼還是略顯冗余。

但是我們這些可憐的C#程序員難道只有在一邊眼饞的份嗎?不見得,我們也可以來“享受”一把:

  1. dynamic b = new XmlMarkupBuilder();  
  2. XElement xml =  
  3.     b.persons(  
  4.         b.person("Tom", age: 10),  
  5.         b.person("Jerry", age: 8));  

哇,這是什么,怎么代碼那么簡單。很明顯,從dynamic關(guān)鍵字上可以看出,這是C# 4.0中新增的功能。您可能會想“原來.NET 4.0對XML又有增強(qiáng)了”……其實并非如此,這是我們自己擴(kuò)展的功能。不過這應(yīng)該算是更好的消息,因為這說明我們已經(jīng)有能力自行擴(kuò)展,自行設(shè)計這樣的API了——這可是“漁”,比“魚”可要值錢多了。而實現(xiàn)這樣的功能也只需要短短二十幾行C#代碼:

  1. public class XmlMarkupBuilder : DynamicObject  
  2. {  
  3.     public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)  
  4.     {  
  5.         XElement xml = new XElement(binder.Name);  
  6.  
  7.         var attrCount = binder.CallInfo.ArgumentNames.Count;  
  8.         var elementCount = args.Length - attrCount;  
  9.  
  10.         for (int i = 0; i < elementCount; i++)  
  11.         {  
  12.             xml.Add(args[i]);  
  13.         }  
  14.  
  15.         for (var i = 0; i < attrCount; i++)  
  16.         {  
  17.             var attrName = binder.CallInfo.ArgumentNames[i];  
  18.             if (attrName[0] == '@') attrName = attrName.Substring(1);  
  19.  
  20.             xml.Add(new XAttribute(attrName, args[i + elementCount]));  
  21.         }  
  22.  
  23.         result = xml;  
  24.         return true;  
  25.     }  
  26. }  
  27.  

DynamicObject是個特殊的對象,簡單地說它的行為可以被“擴(kuò)展”——是如動態(tài)語言般真正的擴(kuò)展,而非靜態(tài)的多態(tài)。當(dāng)我們使用dynamic修飾變量后,在它之上的方法調(diào)用會由編譯器和DLR配合出不一樣的行為。例如,我們在調(diào)用一個方法的時候,DLR會先檢查這個動態(tài)對象上是否存在符合這個簽名的方法,存在則最好,否則便會調(diào)用TryInvokeMember來“執(zhí)行”一個動態(tài)方法,而它的參數(shù)便是此次調(diào)用的全部信息。這樣的做法被稱為“Method Missing”操作,事實上Ruby Markup Builder也是使用Ruby對象中的這個特性來實現(xiàn)“調(diào)用什么方法,便生成什么元素”的功能。事實上,我們還可以這么用:

  1. var persons = new [] { new Person("Tom", 10), new Person("Jerry", 8) };  
  2. XElement xml2 =   
  3.     b.persons(  
  4.         from p in persons  
  5.         select b.person(p.Name, age: p.Age));  

XmlMarkupBuilder對LINQ的直接支持得益于XElement無與倫比的“包容性”(因此我認(rèn)為LINQ to XML其實只是LINQ to Object + 類庫)。至于age: 10這樣的代碼,其實是使用了C# 4.0的新特性:命名參數(shù)(Named Parameters)——C#還真把什么都為我們準(zhǔn)備好了。

即便是大部分DynamicObject的示例都喜歡拿XML操作開涮(但還是沒有出現(xiàn)我這篇的用法,所以我還是“原創(chuàng)”),但事實上這個功能可發(fā)揮的余地非常之大。例如,陳貓同學(xué)提到他想用這個功能來簡化Silverlight中的JSON操作,剛“喜得貴女”的Phil Haack同學(xué)在上個月也提到一個設(shè)想,它在ASP.NET MVC中使用dynamic關(guān)鍵字來修飾View的Model,這樣在訪問Model的屬性時變可附加一些約定好的操作。例如,Model.Content表示讀取Content屬性的內(nèi)容,而Model._Content則表示在讀取Content之后自動進(jìn)行HTML編碼。這無疑簡化了我們的開發(fā)——當(dāng)然,強(qiáng)類型的各種優(yōu)勢就不復(fù)存在了。

而這個功能對我的意義在于,我又找到了一種設(shè)計API的方式,它可以使類庫變得簡單好用——就好比上面的XmlMarkupBuilder一樣。雖然,這個示例的功能非常簡單,但是這也足以證明C# 4.0中的dynamic特性并不僅僅是“方便Interop操作”或是“簡化反射”這么簡單,如果我們可以發(fā)揮想象能力,加以充分利用同時又不濫用,我們的程序開發(fā)生活就會變得越來越美好。

最后……我還是承認(rèn)了吧,這篇文章其實是標(biāo)題黨,真正Ruby Markup Builder功能非常強(qiáng)大而復(fù)雜,我們的XmlMarkupBuilder類只能算是冰山一角而已。

【編輯推薦】

  1. 詳解C# 4.0中的新對象ExpandoObject
  2. 介紹C# 4.0新特性dynamic
  3. C#歷史回顧及C# 4.0新特性一覽
  4. C# 4.0 Dynamic關(guān)鍵字全解析
  5. C# 4.0 的4個新特性
責(zé)任編輯:yangsai 來源: 博客園
相關(guān)推薦

2009-08-19 16:51:14

C# 4.0 dyna

2009-05-26 09:28:22

C# 4.0dynamic動態(tài)類型

2009-07-31 16:34:17

dynamicC# 4.0

2009-05-26 11:15:31

C# 4.0dynamicVisual Stud

2009-08-18 16:42:49

C# 操作XML

2009-05-25 15:42:03

Visual StudC#

2009-08-18 16:30:41

C# 操作XML

2014-04-03 09:36:47

Objective-Cruby消息傳遞

2015-04-01 14:34:37

C#dynamicDictionary性

2009-09-04 15:53:42

C#內(nèi)存流

2009-09-01 09:38:45

COM互操作性

2024-05-06 06:00:00

C#文件存儲

2009-09-03 17:01:04

C#回車切換焦點

2009-08-10 17:41:42

C# Singleto

2009-09-01 17:15:42

C#多線程應(yīng)用

2009-10-20 15:03:29

ExpandoObje

2024-12-31 00:08:37

C#語言dynamic?

2009-10-09 09:07:40

C#委托和事件

2010-01-08 16:52:57

C++和C#

2009-08-13 09:46:49

C#歷史C# 4.0新特性
點贊
收藏

51CTO技術(shù)棧公眾號

国产精品视频26uuu| 亚洲午夜无码久久久久| 一级久久久久久| 亚洲成人毛片| 日韩午夜免费| 欧洲精品一区二区三区在线观看| 91麻豆国产精品| 波多野结衣先锋影音| av在线三区| 97视频一区| 国产偷国产偷精品高清尤物| 欧美男插女视频| 日韩精品一区二区三区不卡 | 国产精品成人网| 欧美日韩不卡合集视频| 一级做a爰片毛片| 日韩三级电影视频| 久久国产精品99精品国产| 日韩极品精品视频免费观看| 欧美国产视频一区| 亚洲在线精品视频| 香蕉久久99| 亚洲成av人片一区二区三区| 91精品国产91久久久久青草| 刘亦菲国产毛片bd| 亚洲天堂资源| 91香蕉视频黄| 欧美日韩国产成人在线| 国产aⅴ激情无码久久久无码| 成年网站在线视频网站| 国产精品18久久久久| 久久久91精品| 一级片免费在线观看视频| 色多多视频在线观看| 日本午夜一区二区| 亚洲欧美国产日韩天堂区| 国产免费成人在线| 蜜桃成人在线视频| 日韩精品午夜视频| 中文字幕亚洲一区二区三区| 青青草原国产在线视频| 快射av在线播放一区| 久久99国产精品久久99 | 国产极品美女在线| 国产人妖一区| 中文字幕精品一区二区精品绿巨人 | 成人啪啪免费看| 国产又粗又黄又猛| 日韩一级二级| ...xxx性欧美| 懂色中文一区二区三区在线视频| 69精品久久久| 神马香蕉久久| 精品国产乱码久久久久久免费| 97在线国产视频| 飘雪影院手机免费高清版在线观看| 久久午夜电影| 久久久精品国产网站| 国产精品成人无码免费| 国产精品一区三区在线观看| 亚洲自拍与偷拍| 久久久精品国产一区二区三区| 在线视频精品免费| 日韩精品免费视频人成| 国产精品高精视频免费| 亚洲综合视频网站| 91麻豆国产自产在线观看亚洲| 欧美一区二区视频在线观看| 青青青青草视频| a视频网址在线观看| 国产亚洲精品精华液| 日韩精品电影网站| 午夜精品一二三区| 久久伊人亚洲| 国产精品mp4| 欧美黑人精品一区二区不卡| 婷婷综合一区| 亚洲欧美日韩图片| 亚洲av成人无码久久精品 | 四虎一区二区| 成人黄色在线观看视频| 国产传媒欧美日韩成人| 高清av免费一区中文字幕| 亚洲精品18在线观看| 久久xxxx| 精品国产网站地址| 欧美熟妇精品一区二区蜜桃视频| 国产精品天堂蜜av在线播放| 在线成人高清不卡| 久久久噜噜噜www成人网| 日韩三级影视| 亚洲成人av在线电影| 亚洲精品一卡二卡三卡四卡| 无码精品黑人一区二区三区| 激情综合五月天| 日韩免费av在线| 日产精品久久久久久久| 91精品一区二区三区综合在线爱 | 天天操精品视频| 午夜欧美激情| 亚洲一区二区精品视频| 亚洲精品视频一二三| 欧美性受ⅹ╳╳╳黑人a性爽| 欧美极品另类videosde| 久99久在线| 成人动漫在线免费观看| 亚洲免费在线视频| 婷婷精品国产一区二区三区日韩 | 成年人免费大片| 爱情电影网av一区二区| 在线观看日韩电影| 中文字幕人妻熟女人妻a片| 玖玖精品在线| 亚洲国模精品私拍| 性高潮久久久久久| 久久99久久人婷婷精品综合| 日韩精品极品在线观看| 污污视频网站在线免费观看| 亚洲理伦在线| 精品美女久久久| 午夜精品久久久久久久久久久| 精品一卡二卡三卡| 国内精品视频| 色婷婷综合激情| 日韩av综合在线观看| 高清视频在线观看三级| 午夜精品一区二区三区免费视频| 中文字幕第80页| 全亚洲第一av番号网站| 欧美成人a∨高清免费观看| 久久久久久国产精品日本| 美女久久99| 欧美劲爆第一页| 国产乡下妇女做爰| 狠狠色丁香婷婷综合| 日韩视频在线播放| 中老年在线免费视频| 精品久久久久久久一区二区蜜臀| 91日韩中文字幕| 欧美日韩福利| 97av在线视频免费播放| 色屁屁影院www国产高清麻豆| 国产精品亚洲综合久久| 日韩暖暖在线视频| 亚洲欧洲精品视频| 亚洲高清免费观看| 色诱av手机版| 丝袜久久网站| 亚州av一区二区| 丁香社区五月天| 蜜臀va亚洲va欧美va天堂| 成人两性免费视频| yiren22综合网成人| 色婷婷av一区二区三区大白胸 | 成人在线播放免费观看| 亚洲欧美日韩系列| 999久久欧美人妻一区二区| 国产蜜臀av在线播放| 日韩一区二区三区四区五区六区| 国产十八熟妇av成人一区| 亚洲天堂免费| 欧美一区二区大胆人体摄影专业网站| 成人毛片在线播放| 久久99国内精品| 亚洲综合欧美日韩| 国产精品一区hongkong| 日韩精品中文字幕一区| 国产伦精品一区二区三区妓女 | 中文字幕精品一区二区精| 久久国产精品免费| 精品国产成人系列| 成人免费a级片| 成人免费在线电影网| 久久久免费精品| 中文字幕视频网站| 久久女同性恋中文字幕| 国产免费色视频| 在线黄色的网站| 亚洲人成在线电影| 欧美黄片一区二区三区| 高清成人在线观看| 天堂资源在线亚洲资源| 欧美男男gaygay1069| xvideos亚洲| 亚洲经典一区二区三区| 色综合天天综合网国产成人综合天| 精品欧美一区二区久久久| 蜜桃视频在线一区| 免费看日b视频| 亚洲a级精品| 欧美极品少妇全裸体| 青青青草网站免费视频在线观看| 欧美伊人久久久久久久久影院| 亚洲av无码专区在线播放中文| 久久精品99久久无色码中文字幕| 777777777亚洲妇女| 国产h视频在线观看| 欧美日韩在线视频首页| 日本a√在线观看| 国产精品毛片一区二区在线看| 国产成人鲁鲁免费视频a| 日本中文字幕在线看| 日韩欧美国产综合一区 | 成人中文字幕+乱码+中文字幕| 日本h片在线| 一区二区三区日韩在线| 久久一区二区三区视频| 成人动漫一区二区三区| 日韩专区第三页| 久久av免费| 99久久自偷自偷国产精品不卡| 黄色的网站在线观看| 日韩国产欧美精品在线| 国产视频aaa| 亚洲欧洲精品一区二区三区不卡| 国产女主播在线播放| 日本欧美在线观看| 少妇高潮喷水在线观看| 国产精品毛片av| 欧美日本国产在线| 国产在线一二| 欧美性色黄大片| 精品无码一区二区三区电影桃花 | 国产日韩欧美在线播放| 成人精品一区二区三区免费| 亚洲国产成人在线播放| 日韩免费黄色片| 久久综合精品国产一区二区三区 | 成人精品高清在线| 色18美女社区| 亚洲色图网站| 色播亚洲婷婷| 亚洲视频分类| 国产精品视频免费观看| 黄色激情在线播放| 欧美xxxx做受欧美.88| 亚洲第一精品网站| 7777精品伊人久久久大香线蕉完整版 | 草民电影神马电影一区二区| 中文字幕日韩在线视频| 午夜视频福利在线| 亚洲第一中文字幕| 亚洲精品网站在线| 日韩一区二区高清| 99在线精品视频免费观看20| 亚洲国产综合色| www日韩在线| 亚洲欧美日韩中文字幕一区二区三区| 国产精品酒店视频| 国产精品久久久久精k8| 欧美色图17p| 中文字幕中文在线不卡住| 三区四区在线观看| 国产精品网友自拍| 日韩一区二区三区四区视频| 国产精品一区二区黑丝| 日本www在线播放| 人人狠狠综合久久亚洲婷| 亚洲a中文字幕| 亚洲欧美电影| 日本久久久a级免费| 国产精品高清乱码在线观看| 久久亚洲成人精品| 爽爽视频在线观看| 制服丝袜亚洲精品中文字幕| 国产男女无套免费网站| 日韩一区二区高清| 亚洲精品久久久蜜桃动漫| 欧美精品一区二区三区四区 | 杨幂一区二区国产精品| 国产一区二区三区在线观看免费视频| 日韩精品福利片午夜免费观看| 牛牛影视一区二区三区免费看| 国产精品扒开腿做爽爽爽的视频| 国产精品伦理| 国产精品亚洲网站| 福利影院在线看| 日韩av大片在线| 欧美成人黄色| 成人国产一区二区| 爽爽窝窝午夜精品一区二区| 日韩免费三级| 午夜激情一区| 亚洲一区二区三区精品动漫| 99热国内精品| 国产乱淫av片杨贵妃| 性欧美暴力猛交另类hd| 国产黄色激情视频| 亚洲国产精品第一区二区三区| 红桃av在线播放| 老司机午夜精品| 少妇高潮喷水久久久久久久久久| 日韩成人免费看| avtt中文字幕| 国产亚洲成aⅴ人片在线观看| 日韩精品123区| 欧美午夜女人视频在线| 91福利在线观看视频| 欧美性视频一区二区三区| 99在线精品视频免费观看软件| 日韩av在线一区二区| 亚洲精品传媒| 97久久超碰福利国产精品…| 久久久国产精品网站| 国产伦精品一区二区三区照片91 | 强伦女教师2:伦理在线观看| 人妖一区二区三区| 亚洲精品不卡| 亚洲尤物在线| 无码人妻一区二区三区在线视频| 久久午夜色播影院免费高清| 日韩欧美123区| 欧美亚洲精品一区| 婷婷色在线视频| 亚洲高清久久网| 91精彩在线视频| 色阁综合伊人av| 欧美69xxx| 日韩有码片在线观看| 麻豆网站免费在线观看| 4k岛国日韩精品**专区| 美女日韩一区| 亚洲欧美久久久久一区二区三区| 亚洲一区不卡| 少妇一级淫片免费放播放| 亚洲欧美日韩综合aⅴ视频| 免费看av在线| 亚洲美女又黄又爽在线观看| 国产蜜臀在线| 96成人在线视频| 亚洲澳门在线| 一级黄色录像在线观看| 国产欧美一区在线| 中文字幕视频网站| 亚洲黄色有码视频| 羞羞电影在线观看www| 成人黄色在线播放| 日本大胆欧美| 青青草av网站| 黑人精品欧美一区二区蜜桃| 免费看黄色的视频| 欧美色视频日本版| 天堂在线视频免费| 97精品国产91久久久久久| 99a精品视频在线观看| 国产精品啪啪啪视频| 国产自产高清不卡| 日本黄色免费片| 一区二区三区四区激情| 日韩精品一卡二卡| 精品少妇一区二区三区视频免付费| 老司机在线永久免费观看| 国产精品视频在线播放| 波多野结衣的一区二区三区 | 都市激情综合| 热舞福利精品大尺度视频| 久久视频在线| 一级片视频免费观看| 不卡视频一二三四| 国产中文字幕免费| 亚洲国产精久久久久久久| √天堂8资源中文在线| 国产精品久久久久久久天堂| 九九视频免费观看视频精品| 超碰av在线免费观看| 国产精品欧美极品| 国产黄色片免费看| 日韩精品视频在线播放| gay欧美网站| 先锋影音欧美| 国产在线一区观看| 麻豆疯狂做受xxxx高潮视频| 色悠悠久久综合| 国产高清一区在线观看| 国产精品一香蕉国产线看观看| 99精品在线观看| 免费黄视频在线观看| 偷拍与自拍一区| 国产欧美日韩综合精品一区二区三区| 久久精品国产清自在天天线| 精品一区二区三区四区五区 | 久久精品色妇熟妇丰满人妻| 91精品国产91综合久久蜜臀| gogo高清在线播放免费| 日韩精品久久久免费观看| 极品少妇xxxx精品少妇| 日本五十熟hd丰满| 一区二区三区黄色| 2020国产精品极品色在线观看| 日本不卡二区| 久久国产免费看| 亚洲激情视频一区| 国产一区二区三区在线观看视频 | 亚洲综合色噜噜狠狠| 亚洲AV成人无码一二三区在线| 国产免费一区视频观看免费| 亚洲激情网址| 日本不卡一二区| 精品无人国产偷自产在线| sm在线观看|