C#中把任意類(lèi)型的泛型集合轉(zhuǎn)換成SQLXML數(shù)據(jù)格式的實(shí)例
話(huà)不多說(shuō),跟著小編一起來(lái)看下吧
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlTypes; using System.Data; using System.Reflection; using System.IO; using System.Xml; namespace CollectionToXml { class Program { static void Main(string[] args) { //persons可替換為任何泛型集合 var persons = new[] { new Person("李元芳", 23) , new Person("狄仁杰", 32) }; SqlXml sqlXml = GenericConver.CollectionToSqlXml(persons); Console.WriteLine(sqlXml.Value); } /// <summary> /// 泛型轉(zhuǎn)換類(lèi) /// </summary> static class GenericConver { /// <summary> /// 集合轉(zhuǎn)換成SQLXML /// </summary> /// <typeparam name="T">泛型參數(shù)(集合成員的類(lèi)型)</typeparam> /// <param name="TCollection">泛型集合</param> /// <returns></returns> public static SqlXml CollectionToSqlXml<T>(IEnumerable<T> TCollection) { //先把集合轉(zhuǎn)換成數(shù)據(jù)表,然后把數(shù)據(jù)表轉(zhuǎn)換成SQLXML return DataTableToSqlXml(CollectionToDataTable(TCollection)); } /// <summary> /// 集合轉(zhuǎn)換成數(shù)據(jù)表 /// </summary> /// <typeparam name="T">泛型參數(shù)(集合成員的類(lèi)型)</typeparam> /// <param name="TCollection">泛型集合</param> /// <returns></returns> public static DataTable CollectionToDataTable<T>(IEnumerable<T> TCollection) { //獲取泛型的具體類(lèi)型 Type type = typeof(T); //獲取類(lèi)型的公共屬性 PropertyInfo[] properties = type.GetProperties(); //創(chuàng)建數(shù)據(jù)表,表名為類(lèi)型名稱(chēng) DataTable table = new DataTable(type.Name); //把公共屬性轉(zhuǎn)行成表格列,再把表格列添加到表格中 foreach (var property in properties) { //創(chuàng)建一個(gè)表格列,列名為屬性名,列數(shù)據(jù)類(lèi)型為屬性的類(lèi)型 DataColumn column = new DataColumn(property.Name, property.PropertyType); //把表格列添加到表格中 table.Columns.Add(column); } //把泛型集合元素添加到數(shù)據(jù)行中 foreach (var item in TCollection) { //創(chuàng)建和表格行架構(gòu)相同的表格行 DataRow row = table.NewRow(); //讀取元素所有屬性列的值,并根據(jù)屬性名稱(chēng),把屬性值添加到表格行中 foreach (var property in properties) row[property.Name] = property.GetValue(item, null); //把表格行添加到表格中 table.Rows.Add(row); } return table; } /// <summary> /// 數(shù)據(jù)表轉(zhuǎn)換成SQLXML /// </summary> /// <param name="table">數(shù)據(jù)表</param> /// <returns></returns> public static SqlXml DataTableToSqlXml(DataTable table) { SqlXml xml; //如果表格名為空,則設(shè)置表格名 if (string.IsNullOrEmpty(table.TableName)) table.TableName = "TableName"; //把數(shù)據(jù)表轉(zhuǎn)換成XML using (var ms = new MemoryStream()) { //把數(shù)據(jù)表轉(zhuǎn)換成XML格式,并寫(xiě)入內(nèi)存流 table.WriteXml(ms); //把內(nèi)存流讀取標(biāo)記設(shè)置回起點(diǎn) ms.Position = 0; //使用XmlReader讀取內(nèi)存流,并創(chuàng)建一個(gè)SqlXml對(duì)象 xml = new SqlXml(XmlReader.Create(ms)); } return xml; } } /// <summary> /// 人類(lèi)(測(cè)試數(shù)據(jù)類(lèi)) /// </summary> class Person { /// <summary> /// 構(gòu)造函數(shù) /// </summary> /// <param name="name">名稱(chēng)</param> /// <param name="age">年齡</param> public Person(string name, int age) { Name = name; Age = age; } /// <summary> /// 名稱(chēng) /// </summary> public string Name { get; set; } /// <summary> /// 年齡 /// </summary> public int Age { get; set; } } } }
輸出結(jié)果:
<DocumentElement> <Person> <Name>李元芳</Name> <Age>23</Age> </Person> <Person> <Name>狄仁杰</Name> <Age>32</Age> </Person> </DocumentElement>
主要是通過(guò)反射,讀取泛型類(lèi)型的屬性,然后根據(jù)讀取到的屬性生成數(shù)據(jù)表,再把數(shù)據(jù)表轉(zhuǎn)換成XML格式。
注釋已經(jīng)寫(xiě)得很詳盡了,我也不知道還需要說(shuō)明點(diǎn)什么,如果這個(gè)小例子能幫到誰(shuí)的小忙就最好不過(guò)了哈~
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- C#數(shù)據(jù)類(lèi)型轉(zhuǎn)換(顯式轉(zhuǎn)型、隱式轉(zhuǎn)型、強(qiáng)制轉(zhuǎn)型)
- C#中數(shù)據(jù)類(lèi)型的轉(zhuǎn)換介紹
- C# 數(shù)據(jù)類(lèi)型轉(zhuǎn)換
- 詳解C# 泛型中的數(shù)據(jù)類(lèi)型判定與轉(zhuǎn)換
- 詳解C#數(shù)據(jù)類(lèi)型及其轉(zhuǎn)換
- c#之用戶(hù)定義的數(shù)據(jù)類(lèi)型轉(zhuǎn)換介紹
- 淺析C#數(shù)據(jù)類(lèi)型轉(zhuǎn)換的幾種形式
- C#基礎(chǔ)之?dāng)?shù)據(jù)類(lèi)型轉(zhuǎn)換
相關(guān)文章
winfrom 在業(yè)務(wù)層實(shí)現(xiàn)事務(wù)控制的小例子
winfrom 在業(yè)務(wù)層實(shí)現(xiàn)事務(wù)控制的小例子,需要的朋友可以參考一下2013-03-03基于WPF繪制一個(gè)點(diǎn)贊大拇指動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)繪制一個(gè)點(diǎn)贊大拇指動(dòng)畫(huà),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下2023-02-02C#Windows窗體設(shè)計(jì)之ContextMenuStrip(鼠標(biāo)右擊菜單)的使用
這篇文章主要介紹了C#Windows窗體設(shè)計(jì)之ContextMenuStrip(鼠標(biāo)右擊菜單)的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07C# websocket及時(shí)通信協(xié)議的實(shí)現(xiàn)方法示例
說(shuō)到websocket大家一定不會(huì)陌生,WebSocket是HTML5一種新的協(xié)議。下面這篇文章主要給大家介紹了關(guān)于C# websocket及時(shí)通信協(xié)議的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-11-11unity 如何使用文件流讀取streamingassets下的資源
這篇文章主要介紹了unity 使用文件流讀取streamingassets下的資源操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04C#語(yǔ)言基礎(chǔ)——結(jié)構(gòu)體和枚舉類(lèi)型全面解析
下面小編就為大家?guī)?lái)一篇C#語(yǔ)言基礎(chǔ)——結(jié)構(gòu)體和枚舉類(lèi)型全面解析。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07C#中使用ArrayPool和MemoryPool實(shí)例
對(duì)資源的可復(fù)用是提升應(yīng)用程序性能的一個(gè)非常重要的手段,比如本篇要分享的 ArrayPool 和 MemoryPool,它們就有效的減少了內(nèi)存使用和對(duì)GC的壓力,從而提升應(yīng)用程序性能。感興趣的可以了解一下2021-05-05