DataSet和List<T> 泛型之间互相转换 (转载, 作者写的很好)

/DataSet与泛型集合间的互相转换

//利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值。

//注意:从DataSet到IList<T>的转换,自定义类型的公开属性必须与DataTable中的字段名称

//一致,才能到达想要的结果。建议DataTable的定义从数据库来,自定义类型用O/R Mapping的方式获得。

//代码说明

/// <summary>

/// 泛型集合与DataSet互相转换

/// </summary>

using System.Data;

using System.Reflection;

using System.Collections;

using System.Collections.Generic;

using System;

public class IListDataSet

{

    /// <summary>

    /// 集合装换DataSet

    /// </summary>

    /// <param name="list">集合</param>

    /// <returns></returns>

    /// 2008-08-01 22:08 HPDV2806

    public static DataSet ToDataSet(IList p_List)

    {

        DataSet result = new DataSet();

        DataTable _DataTable = new DataTable();

        if (p_List.Count > 0)

        {

            PropertyInfo[] propertys = p_List[0].GetType().GetProperties();

            foreach (PropertyInfo pi in propertys)

            {

                _DataTable.Columns.Add(pi.Name, pi.PropertyType);

            }

            for (int i = 0; i < p_List.Count; i++)

            {

                ArrayList tempList = new ArrayList();

                foreach (PropertyInfo pi in propertys)

                {

                    object obj = pi.GetValue(p_List[i], null);

                    tempList.Add(obj);

                }

                object[] array = tempList.ToArray();

                _DataTable.LoadDataRow(array, true);

            }

        }

        result.Tables.Add(_DataTable);

        return result;

    }

    /// <summary>

    /// 泛型集合转换DataSet

    /// </summary>

    /// <typeparam name="T"></typeparam>

    /// <param name="list">泛型集合</param>

    /// <returns></returns>

    /// 2008-08-01 22:43 HPDV2806

    public static DataSet ToDataSet<T>(IList<T> list)

    {

        return ToDataSet<T>(list, null);

    }

    /// <summary>

    /// 泛型集合转换DataSet

    /// </summary>

    /// <typeparam name="T"></typeparam>

    /// <param name="p_List">泛型集合</param>

    /// <param name="p_PropertyName">待转换属性名数组</param>

    /// <returns></returns>

    /// 2008-08-01 22:44 HPDV2806

    public static DataSet ToDataSet<T>(IList<T> p_List, params string[] p_PropertyName)

    {

        List<string> propertyNameList = new List<string>();

        if (p_PropertyName != null)

            propertyNameList.AddRange(p_PropertyName);

        DataSet result = new DataSet();

        DataTable _DataTable = new DataTable();

        if (p_List.Count > 0)

        {

            PropertyInfo[] propertys = p_List[0].GetType().GetProperties();

            foreach (PropertyInfo pi in propertys)

            {

                if (propertyNameList.Count == 0)

                {

                    // 没有指定属性的情况下全部属性都要转换

                    _DataTable.Columns.Add(pi.Name, pi.PropertyType);

                }

                else

                {

                    if (propertyNameList.Contains(pi.Name))

                        _DataTable.Columns.Add(pi.Name, pi.PropertyType);

                }

            }

            for (int i = 0; i < p_List.Count; i++)

            {

                ArrayList tempList = new ArrayList();

                foreach (PropertyInfo pi in propertys)

                {

                    if (propertyNameList.Count == 0)

                    {

                        object obj = pi.GetValue(p_List[i], null);

                        tempList.Add(obj);

                    }

                    else

                    {

                        if (propertyNameList.Contains(pi.Name))

                        {

                            object obj = pi.GetValue(p_List[i], null);

                            tempList.Add(obj);

                        }

                    }

                }

                object[] array = tempList.ToArray();

                _DataTable.LoadDataRow(array, true);

            }

        }

        result.Tables.Add(_DataTable);

        return result;

    }

    /// <summary>

    /// DataSet装换为泛型集合

    /// </summary>

    /// <typeparam name="T"></typeparam>

    /// <param name="p_DataSet">DataSet</param>

    /// <param name="p_TableIndex">待转换数据表索引</param>

    /// <returns></returns>

    /// 2008-08-01 22:46 HPDV2806

    public static IList<T> DataSetToIList<T>(DataSet p_DataSet, int p_TableIndex)

    {

        if (p_DataSet == null || p_DataSet.Tables.Count < 0)

            return null;

        if (p_TableIndex > p_DataSet.Tables.Count - 1)

            return null;

        if (p_TableIndex < 0)

            p_TableIndex = 0;

        DataTable p_Data = p_DataSet.Tables[p_TableIndex];

        // 返回值初始化

        IList<T> result = new List<T>();

        for (int j = 0; j < p_Data.Rows.Count; j++)

        {

            T _t = (T)Activator.CreateInstance(typeof(T));

            PropertyInfo[] propertys = _t.GetType().GetProperties();

            foreach (PropertyInfo pi in propertys)

            {

                for (int i = 0; i < p_Data.Columns.Count; i++)

                {

                    // 属性与字段名称一致的进行赋值

                    if (pi.Name.Equals(p_Data.Columns[i].ColumnName))

                    {

                        // 数据库NULL值单独处理

                        if (p_Data.Rows[j][i] != DBNull.Value)

                            pi.SetValue(_t, p_Data.Rows[j][i], null);

                        else

                            pi.SetValue(_t, null, null);

                        break;

                    }

                }

            }

            result.Add(_t);

        }

        return result;

    }

    /// <summary>

    /// DataSet装换为泛型集合

    /// </summary>

    /// <typeparam name="T"></typeparam>

    /// <param name="p_DataSet">DataSet</param>

    /// <param name="p_TableName">待转换数据表名称</param>

    /// <returns></returns>

    /// 2008-08-01 22:47 HPDV2806

    public static IList<T> DataSetToIList<T>(DataSet p_DataSet, string p_TableName)

    {

        int _TableIndex = 0;

        if (p_DataSet == null || p_DataSet.Tables.Count < 0)

            return null;

        if (string.IsNullOrEmpty(p_TableName))

            return null;

        for (int i = 0; i < p_DataSet.Tables.Count; i++)

        {

            // 获取Table名称在Tables集合中的索引值

            if (p_DataSet.Tables[i].TableName.Equals(p_TableName))

            {

                _TableIndex = i;

                break;

            }

        }

        return DataSetToIList<T>(p_DataSet, _TableIndex);

    }

}

/*****************

使用范围

1. 可以用在业务层中数据获取,获取DataSet的同时也可以转为IList集合为调用者所使用。

2. 在WebServices中传输自定义类型使用,即传递参数都用DataSet类型(WebServices直接支持的数据类型),在使用前将其转换为IList来使用。

 * ******************************/

时间: 2024-10-05 23:04:27

DataSet和List<T> 泛型之间互相转换 (转载, 作者写的很好)的相关文章

Asp.net中XML与DataSet、DataTable之间的转换

using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Xml; using System.IO; using System.Web; namespace Utility { /// <summary> /// 把DataSet.DataTable.DataView格式转换成XML字符串.XML文件 /// </summary> public

Jackson如何实现json字符串和泛型List集合之间的转换

前言: Jackson常用方法:   Jackson是处理一般的java对象和json之间的转换常用的两个方法是ObjectMapper类的writeValueAsString()和readValue()两个方法就可以实现. 但是,如果是要转成指定泛型的List集合,如List<User>.就需要先反序列化复杂类型为泛型 Collection Type; 举例说明: 如果是List<User>集合,那么使用ObjectMapper的getTypeFactory().construc

DataSet装换为泛型集合 222

#region DataSet装换为泛型集合 /// <summary> /// 利用反射和泛型 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static List<T> ConvertToList<T>(DataTable dt) { // 定义集合 List<T> ts

AutoMapper(一)——实现数据契约和实体类之间的转换

以前做过Object到Object的转换方法的封装,底层主要还是靠反射取值赋值+循环来实现的.最近在公司里维护旧系统,这个系统使用了WCF,当时就很好奇他们的数据契约到实体模型的转换时怎么做的,之后查看源码,发现他们居然是一个属性一个属性的赋值过来的,当时就给我雷到了,难道就没有人举得这个地方可以封装起来吗? 据我目前了解,有三种方法可以实现这个实体类到实体类的转换过程,下面来简述下这三种方式. 第一种,也是最简单的一种,是用list自带的转换方法,但是这种方法需要自己定义转换规则,写起来也挺麻

Java 集合与数组之间的转换

Java 集合与数组之间的转换 @author ixenos 数组转集合 Arrays.asList(T... a) 先给结论:用 Arrays.asList(T... a) 将数组转换成集合 (T...a)是可变参数,看成(T[] a)即可 <T> List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表,这是披着List外表的纯数组,只是原数组的一个视图(对返回列表的更改会“直接写”到数组.) 返回的列表是可序列化的,并且实现了 RandomAcce

跟王老师学泛型(八):泛型擦除与转换

泛型擦除与转换 主讲教师:王少华 QQ群:483773664 学习目标: 掌握泛型擦除的含义 理解泛型转换的规则 一.泛型擦除 (一)什么泛型擦除 Java中的泛型基本上都是在编译器这个层次来实现的.在生成的Java字节码中是不包含泛型中的类型信息的.也就是说虚拟机中没有泛型,只有普通类和普通方法 使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉.这个过程就称为类型擦除. 类型擦除的主要过程如下:     1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换.     2.移除所有

DataSet装换为泛型集合

/// <summary> /// DataSet装换为泛型集合 /// </summary> /// <typeparam name="MoDeviceAbnormalStateRecord"></typeparam> /// <param name="p_DataSet">DataSet</param> /// <param name="p_TableIndex"&

Android单位转换 (px、dp、sp之间的转换工具类)

在Android开发中,涉及到屏幕视频问题的时候,px.dp.sp之间的转换比较重要的一部分,所以杨哥整理了一个工具类给大伙用. package com.zw.express.tool; import android.content.Context;import android.util.DisplayMetrics;/** * ydc * @author Administrator * */public class DensityUtils { /**     * 根据手机的分辨率从 dip

API--Date-毫秒值和对象之间的转换

java.util 类 Date 类 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值.它也允许格式化和解析日期字符串.不过,这些函数的 API 不易于实现国际化.从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串.Date 中的相应方法已废弃. 月份由从 0 至 11 的整数表示:0 是一月.1 是二月等等:因此