C#中把任意類型的泛型集合轉(zhuǎn)換成SQLXML數(shù)據(jù)格式的實(shí)例
話不多說,跟著小編一起來看下吧
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)換類
/// </summary>
static class GenericConver
{
/// <summary>
/// 集合轉(zhuǎn)換成SQLXML
/// </summary>
/// <typeparam name="T">泛型參數(shù)(集合成員的類型)</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ù)(集合成員的類型)</typeparam>
/// <param name="TCollection">泛型集合</param>
/// <returns></returns>
public static DataTable CollectionToDataTable<T>(IEnumerable<T> TCollection)
{
//獲取泛型的具體類型
Type type = typeof(T);
//獲取類型的公共屬性
PropertyInfo[] properties = type.GetProperties();
//創(chuàng)建數(shù)據(jù)表,表名為類型名稱
DataTable table = new DataTable(type.Name);
//把公共屬性轉(zhuǎn)行成表格列,再把表格列添加到表格中
foreach (var property in properties)
{
//創(chuàng)建一個(gè)表格列,列名為屬性名,列數(shù)據(jù)類型為屬性的類型
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ù)屬性名稱,把屬性值添加到表格行中
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格式,并寫入內(nèi)存流
table.WriteXml(ms);
//把內(nèi)存流讀取標(biāo)記設(shè)置回起點(diǎn)
ms.Position = 0;
//使用XmlReader讀取內(nèi)存流,并創(chuàng)建一個(gè)SqlXml對象
xml = new SqlXml(XmlReader.Create(ms));
}
return xml;
}
}
/// <summary>
/// 人類(測試數(shù)據(jù)類)
/// </summary>
class Person
{
/// <summary>
/// 構(gòu)造函數(shù)
/// </summary>
/// <param name="name">名稱</param>
/// <param name="age">年齡</param>
public Person(string name, int age)
{ Name = name; Age = age; }
/// <summary>
/// 名稱
/// </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>
主要是通過反射,讀取泛型類型的屬性,然后根據(jù)讀取到的屬性生成數(shù)據(jù)表,再把數(shù)據(jù)表轉(zhuǎn)換成XML格式。
注釋已經(jīng)寫得很詳盡了,我也不知道還需要說明點(diǎn)什么,如果這個(gè)小例子能幫到誰的小忙就最好不過了哈~
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
winfrom 在業(yè)務(wù)層實(shí)現(xiàn)事務(wù)控制的小例子
winfrom 在業(yè)務(wù)層實(shí)現(xiàn)事務(wù)控制的小例子,需要的朋友可以參考一下2013-03-03
C#Windows窗體設(shè)計(jì)之ContextMenuStrip(鼠標(biāo)右擊菜單)的使用
這篇文章主要介紹了C#Windows窗體設(shè)計(jì)之ContextMenuStrip(鼠標(biāo)右擊菜單)的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
C# websocket及時(shí)通信協(xié)議的實(shí)現(xiàn)方法示例
說到websocket大家一定不會陌生,WebSocket是HTML5一種新的協(xié)議。下面這篇文章主要給大家介紹了關(guān)于C# websocket及時(shí)通信協(xié)議的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11
unity 如何使用文件流讀取streamingassets下的資源
這篇文章主要介紹了unity 使用文件流讀取streamingassets下的資源操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
C#語言基礎(chǔ)——結(jié)構(gòu)體和枚舉類型全面解析
下面小編就為大家?guī)硪黄狢#語言基礎(chǔ)——結(jié)構(gòu)體和枚舉類型全面解析。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07
C#中使用ArrayPool和MemoryPool實(shí)例
對資源的可復(fù)用是提升應(yīng)用程序性能的一個(gè)非常重要的手段,比如本篇要分享的 ArrayPool 和 MemoryPool,它們就有效的減少了內(nèi)存使用和對GC的壓力,從而提升應(yīng)用程序性能。感興趣的可以了解一下2021-05-05

