日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁(yè)編程開發(fā)其它知識(shí) → XmlAttribute與實(shí)體的轉(zhuǎn)換和匹配方案

      XmlAttribute與實(shí)體的轉(zhuǎn)換和匹配方案

      相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:jasenkin時(shí)間:2011/12/31 1:53:49字體大。A-A+

      作者:jasenkin點(diǎn)擊:80次評(píng)論:0次標(biāo)簽: XmlAttribute

      • 類型:音頻處理大。1M語(yǔ)言:中文 評(píng)分:5.1
      • 標(biāo)簽:
      立即下載

      一、前言

      可擴(kuò)展標(biāo)記語(yǔ)言 (XML) 是具有結(jié)構(gòu)性的標(biāo)記語(yǔ)言,可以用來(lái)標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對(duì)自己的標(biāo)記語(yǔ)言進(jìn)行定義的源語(yǔ)言。XML是用來(lái)存儲(chǔ)數(shù)據(jù)的,重在數(shù)據(jù)本身。本文中的代碼是幾個(gè)月前整理的,最近幾個(gè)月的時(shí)間很少寫隨筆,除了工作以外,主要還是忙于整理自己的框架。這篇隨筆主要是針對(duì)于XML的特性Attribute與實(shí)體之間的匹配與轉(zhuǎn)換,其中的內(nèi)容包括反射、XML以及LinqToXml,代碼的內(nèi)容也是想到什么就寫什么,純屬練習(xí)下手感,僅供參考。下一篇隨筆將以另外的形式來(lái)轉(zhuǎn)換Xml為對(duì)象實(shí)體,當(dāng)然,也是以反射為主,和本隨筆中的思路差不多,主要是XML的格式和解決方案不同而已。對(duì)于如何將對(duì)象轉(zhuǎn)換成Xml的話,主要還是看情況,僅僅轉(zhuǎn)換簡(jiǎn)單的對(duì)象的話,直接反射就可以生成。對(duì)于復(fù)雜的對(duì)象的話,可以采用dynamic,樹結(jié)構(gòu)和遞歸算法的方案來(lái)定制XML。

      二、類圖設(shè)計(jì)

      該處的主要思路為:通過(guò)反射將與類名(類特性名稱或者類名)的節(jié)點(diǎn)匹配,然后匹配屬性(屬性特性名稱或者屬性名稱)值。反之,則遍歷實(shí)體對(duì)象的屬性,設(shè)置相應(yīng)的XML。本來(lái)還想細(xì)化一下匹配與轉(zhuǎn)換操作的,但是該類的EA文件不知道放在哪里了,只有設(shè)計(jì)的截圖還在,XO。相關(guān)類圖設(shè)計(jì)如下:

       

       PropertyAttribute主要設(shè)置屬性的特性名稱,用于轉(zhuǎn)換過(guò)程設(shè)置屬性的別名,同時(shí)匹配過(guò)程中匹配XML的特性與屬性的名稱。

       ClassAttribute主要設(shè)置類的特性名稱,用于轉(zhuǎn)換過(guò)程設(shè)置類的別名,同時(shí)匹配過(guò)程中匹配XML的節(jié)點(diǎn)與類的名稱。

       StringExtension主要是字符串的擴(kuò)展方法。

       FuncDictionary主要轉(zhuǎn)換字符串為特定類型的值。

       XmlAttributeUtility主要轉(zhuǎn)換實(shí)體對(duì)象為XML以及匹配XML為實(shí)體對(duì)象,其中還包括一些其他基本操作。

      三、具體實(shí)現(xiàn)

      先看下FuncDictionary,該類主要通過(guò)異步委托將字符串轉(zhuǎn)換成相應(yīng)的簡(jiǎn)單類型,所有實(shí)現(xiàn)圍繞該類進(jìn)行相關(guān)操作。FuncDictionary基本涵蓋了C#中的所有簡(jiǎn)單類型,可以將字符串轉(zhuǎn)換成這些簡(jiǎn)單類型。

      主要方法為:public object DynamicInvoke(Type type, string arg),通過(guò)傳入的類型和字符串值,可以轉(zhuǎn)換成相應(yīng)的Object值。屬性Dictionary中涵蓋了所有簡(jiǎn)單類型轉(zhuǎn)換的委托操作。代碼如下:

       1     public class FuncDictionary
       2     {
       3         public static IDictionary<Type, Delegate> Dictionary
       4         {
       5             get;
       6             private set;
       7         }
       8 
       9         static FuncDictionary()
      10         {
      11             if (FuncDictionary.Dictionary == null)
      12             {
      13                 FuncDictionary.Dictionary = CreateDictionary();
      14             }
      15         }
      16 
      17         public object DynamicInvoke(Type type, string arg)
      18         {
      19             if (type == null)
      20             {
      21                 return null;
      22             }
      23 
      24             if (FuncDictionary.Dictionary == null)
      25             {
      26                 FuncDictionary.Dictionary = CreateDictionary();
      27             }
      28 
      29             if (!FuncDictionary.Dictionary.ContainsKey(type))
      30             {
      31                 return null;
      32             }
      33 
      34             Delegate action = FuncDictionary.Dictionary[type];
      35 
      36             return action.DynamicInvoke(new object[] { arg });
      37         }
      38 
      39         public static IDictionary<Type, Delegate> CreateDictionary()
      40         {
      41             var dictionary = new Dictionary<Type, Delegate>();
      42 
      43             dictionary.Add(typeof(string), new Func<string, string>(p => p));
      44             dictionary.Add(typeof(decimal), new Func<string, decimal>(p => p.AsDecimal()));
      45             dictionary.Add(typeof(DateTime), new Func<string, DateTime>(p => p.AsDateTime()));
      46             dictionary.Add(typeof(float), new Func<string, float>(p => p.AsFloat()));
      47             dictionary.Add(typeof(double), new Func<string, double>(p => p.AsDouble()));
      48             dictionary.Add(typeof(int), new Func<string, int>(p => p.AsInt()));
      49             dictionary.Add(typeof(byte), new Func<string, byte>(p => p.AsByte()));
      50             dictionary.Add(typeof(sbyte), new Func<string, sbyte>(p => p.AsSbyte()));
      51             dictionary.Add(typeof(short), new Func<string, short>(p => p.AsShort()));
      52             dictionary.Add(typeof(ushort), new Func<string, ushort>(p => p.AsUshort()));
      53             dictionary.Add(typeof(uint), new Func<string, uint>(p => p.AsUint()));
      54             dictionary.Add(typeof(long), new Func<string, long>(p => p.AsLong()));
      55             dictionary.Add(typeof(ulong), new Func<string, ulong>(p => p.AsUlong()));
      56             dictionary.Add(typeof(char), new Func<string, char>(p => p.AsChar()));
      57             dictionary.Add(typeof(bool), new Func<string, bool>(p => p.AsBool()));
      58             dictionary.Add(typeof(Color), new Func<string, Color>(p => p.AsColor()));
      59 
      60             return dictionary;
      61         }
      62     }

       再看下XmlAttributeUtility類,該類主要包括轉(zhuǎn)換和匹配操作。匹配主要為兩種方案(主要邏輯為以下代碼的72-183行):

      1、通過(guò)XmlReader順序讀取來(lái)設(shè)置實(shí)體的值,主要方法為public static IList<T> Parse<T>(XmlReader reader) where T : new():

      2、通過(guò)遍歷XmlNodeList中的節(jié)點(diǎn),依次遍歷節(jié)點(diǎn)中的XmlAttribute設(shè)置實(shí)體的屬性的值,主要方法為:public static IList<T> Parse<T>(XmlNodeList nodeList) where T : new()

      XmlAttributeUtility的轉(zhuǎn)換操作相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,采用反射+LinqToXml轉(zhuǎn)換操作就很簡(jiǎn)單了,主要實(shí)現(xiàn)方法為public static XElement Convert<T>(T entity) where T : new(),其他方法都是以該方法作為基礎(chǔ)來(lái)進(jìn)行操作。為什么用LinqToXml?主要原因是LinqToXml比Xml更方便,很多細(xì)節(jié)方面不需要考慮太多。

      該類中還包括其他的一些操作,此處不再概述,詳細(xì)參見源碼。

      四、單元測(cè)試

       FuncDictionary的單元測(cè)試必須涵蓋所有類型的測(cè)試才能將代碼覆蓋率達(dá)到100%,此處只針對(duì)DateTime做正常測(cè)試、異常測(cè)試和空值測(cè)試(當(dāng)然,對(duì)于其他類型的方法,可能還需要做腳本測(cè)試,SQL注入測(cè)試等,這三種類型的測(cè)試是最基本的測(cè)試),其他代碼的單元測(cè)試詳細(xì)見源代碼,也僅僅只做了些基本的測(cè)試,寫測(cè)試比寫代碼費(fèi)哥的時(shí)間.

      五、總結(jié)

      以上的代碼僅僅是當(dāng)時(shí)想著怎么實(shí)現(xiàn)就怎么寫的,完全是隨意而寫。僅供參考,實(shí)戰(zhàn)沒有多大意義,純粹練習(xí)下靈感和手感,增強(qiáng)對(duì)技術(shù)的敏感性而已,純屬娛樂。對(duì)于

      <Lexer LexerName="Name0" FontColor="#EE2BA9" CreatedTime="2011-10-25T21:16:18.7866084+08:00" Count="0" Exist="true" LineCommentPrefix="LineCommentPrefix0" StreamCommentPrefix="StreamCommentPrefix0" StreamCommentSuffix="StreamCommentSuffix0" />此類格式的Xml轉(zhuǎn)換和匹配,以上的代碼完全能夠滿足該需求。下一篇將講述另外一種格式的匹配,不過(guò)也是通過(guò)反射和XmlReader來(lái)進(jìn)行匹配的。

      今天也是2011年最后一天,明天就是2012年了,在此恭祝大家2012元旦快樂,新一年,日子順心多平安;新一年,祝福多多又暖暖;新一年,愿望件件都圓滿;新一年,幸?鞓吩鐚(shí)現(xiàn);新一年,元旦祝福圍身邊;瑪雅終結(jié)之年到了,所以,為了拯救人類,一定要快樂哦!

      源碼下載:XmlAttribute轉(zhuǎn)換和匹配源代碼

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過(guò)難過(guò)
        • 5 囧
        • 3 圍觀圍觀
        • 2 無(wú)聊無(wú)聊

        熱門評(píng)論

        最新評(píng)論

        發(fā)表評(píng)論 查看所有評(píng)論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)