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("李元芳", ) ,
new Person("狄仁杰", )
};
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 = ;
//使用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格式。

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

C#中把任意类型的泛型集合转换成SQLXML数据格式的小例子的更多相关文章

  1. C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串

    在工作中,如果需要跟XML打交道,难免会遇到需要把一个类型集合转换成XML格式的情况.之前的方法比较笨拙,需要给不同的类型,各自写一个转换的函数.但是后来接触反射后,就知道可以利用反射去读取一个类型的 ...

  2. 将java类的泛型集合转换成json对象

    一般用extjs开发传输都是用json比较多,这个将来大家也许会用到... ConvertJsonUtils.java package com.sunweb.util.jsonfactory; imp ...

  3. 对比两个同类型的泛型集合并返回差异泛型集合 ——两个List<类名>的比较

    1: /// <summary> 2: /// 对比两个同类型的泛型集合并返回差异泛型集合 3: /// </summary> 4: /// <typeparam nam ...

  4. C#中对象,字符串,dataTable、DataReader、DataSet,对象集合转换成Json字符串方法。

    C#中对象,字符串,dataTable.DataReader.DataSet,对象集合转换成Json字符串方法. public class ConvertJson { #region 私有方法 /// ...

  5. 表单中的日期 字符串和Javabean中的日期类型的属性自动转换

    搞了一上午的bug最终还是因为自己springMVC的注解不熟悉的原因,特记录. 在实际操作中经常会碰到表单中的日期 字符串和Javabean中的日期类型的属性自动转换, 而springMVC默认不支 ...

  6. 在一般处理程序中,把Form Post过来的表单集合转换成对象 ,仿 MVC post,反射原理

    using System; using System.Collections.Generic; using System.Collections.Specialized; using System.L ...

  7. List转DataTable(反射) ; 将泛型集合类转换成DataTable ; 将集合类转换成DataTable

    public class ConvertX { #region 将集合类转换成DataTable /// <summary> /// 将集合类转换成DataTable /// </s ...

  8. list集合转换成datatable

    /// 将list集合转换成datatable /// </summary> /// <param name="list"></param> / ...

  9. SQL 把表中字段存储的逗号隔开内容转换成列表形式

    原文:[原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式 我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ...

随机推荐

  1. Netty--TCP粘包和拆包

    TCP协议以流的方式进行数据传输,它无法理解其上层协议的数据意义,而是根据TCP缓冲区的大小对数据进行拆分或组装,即上层一个完整的包可能被拆为几个TCP包来发送,或上层几个包会被组合为一个TCP包发送 ...

  2. Zookeeper--集群管理

    Zookeeper--集群管理 在多台服务器组成的集群中,需要监控每台服务器的状态,一旦某台服务器挂掉了或有新的机器加入集群,集群都要感知到,从而采取相应的措施.一个主动的集群可以自动感知节点的死亡和 ...

  3. Java中的强制类型转换

    例如,当程序中需要将 double 型变量的值赋给一个 int 型变量,该如何实现呢? 显然,这种转换是不会自动进行的!因为 int 型的存储范围比 double 型的小.此时就需要通过强制类型转换来 ...

  4. limesurvey的问卷类型

  5. 5月15日上课笔记-js中 location对象的属性、document对象、js内置对象、Date事件对象、

    location的属性: host: 返回当前主机名和端口号 定时函数: setTimeout( ) setInterval() 二.document对象 getElementById(); 根据ID ...

  6. Centos 文件查找命令

    find [搜索范围] [搜索条件] #搜索文件 find / -name install.log #避免大范围搜索,会非常耗费系统资源 #find是在系统当中搜索符合条件的文件名.如果需要匹配,使用 ...

  7. RMI原理及简单demo

    1 简介 RMI是远程方法调用的简称,它能够帮助我们查找并执行远程对象的方法.通俗地说,远程调用就象将一个class放在A机器上,然后在B机器中调用这个class的方法. 2 概念 其他机器需要调用的 ...

  8. java 堆、栈、常量池等

    寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态成员 常量池:存放常量 ...

  9. windows server 2008 配置DNS服务器与IIS

    0x00: 总结这个星期在学校学的. 0x01安装: 首先你得安装好windows server 2008 然后在添加角色->安装IIS和DNS服务器 勾选好你要安装的. 安装-> 根据老 ...

  10. git账户的存储

    在使用git时,使用git pull,或git push,每次都要我输入用户名和密码,比较麻烦.git有个参数可以解决这个问题. 修改./git/config文件,增加 [credential] he ...