首页 > 编程 > C# > 正文

C#中把任意类型的泛型集合转换成SQLXML数据格式的实例

2020-01-24 00:53:24
字体:
来源:转载
供稿:网友

话不多说,跟着小编一起来看下吧

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>  /// 泛型转换类  /// </summary>  static class GenericConver  {   /// <summary>   /// 集合转换成SQLXML   /// </summary>   /// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>   /// <param name="TCollection">泛型集合</param>   /// <returns></returns>   public static SqlXml CollectionToSqlXml<T>(IEnumerable<T> TCollection)   {    //先把集合转换成数据表,然后把数据表转换成SQLXML    return DataTableToSqlXml(CollectionToDataTable(TCollection));   }   /// <summary>   /// 集合转换成数据表   /// </summary>   /// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>   /// <param name="TCollection">泛型集合</param>   /// <returns></returns>   public static DataTable CollectionToDataTable<T>(IEnumerable<T> TCollection)   {    //获取泛型的具体类型    Type type = typeof(T);    //获取类型的公共属性    PropertyInfo[] properties = type.GetProperties();    //创建数据表,表名为类型名称    DataTable table = new DataTable(type.Name);    //把公共属性转行成表格列,再把表格列添加到表格中    foreach (var property in properties)    {     //创建一个表格列,列名为属性名,列数据类型为属性的类型     DataColumn column = new DataColumn(property.Name, property.PropertyType);     //把表格列添加到表格中     table.Columns.Add(column);    }    //把泛型集合元素添加到数据行中    foreach (var item in TCollection)    {     //创建和表格行架构相同的表格行     DataRow row = table.NewRow();     //读取元素所有属性列的值,并根据属性名称,把属性值添加到表格行中     foreach (var property in properties)      row[property.Name] = property.GetValue(item, null);     //把表格行添加到表格中     table.Rows.Add(row);    }    return table;   }   /// <summary>   /// 数据表转换成SQLXML   /// </summary>   /// <param name="table">数据表</param>   /// <returns></returns>   public static SqlXml DataTableToSqlXml(DataTable table)   {    SqlXml xml;    //如果表格名为空,则设置表格名    if (string.IsNullOrEmpty(table.TableName))     table.TableName = "TableName";    //把数据表转换成XML    using (var ms = new MemoryStream())    {     //把数据表转换成XML格式,并写入内存流     table.WriteXml(ms);     //把内存流读取标记设置回起点     ms.Position = 0;     //使用XmlReader读取内存流,并创建一个SqlXml对象     xml = new SqlXml(XmlReader.Create(ms));    }    return xml;   }  }  /// <summary>  /// 人类(测试数据类)  /// </summary>  class Person  {   /// <summary>   /// 构造函数   /// </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; }  } }}

输出结果:

<DocumentElement> <Person> <Name>李元芳</Name> <Age>23</Age> </Person> <Person> <Name>狄仁杰</Name> <Age>32</Age> </Person></DocumentElement>

主要是通过反射,读取泛型类型的属性,然后根据读取到的属性生成数据表,再把数据表转换成XML格式。

注释已经写得很详尽了,我也不知道还需要说明点什么,如果这个小例子能帮到谁的小忙就最好不过了哈~

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持武林网!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表