一些DataTable和IList间转换的封装

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.ComponentModel;
using System.Reflection;

public class CollectionHelper
    {
        private CollectionHelper()
        {
        }
        public static List<T> Distinct<T>(IList<T> list)
        {
            List<T> list1 = new List<T>();
            foreach (T obj in list)
            {
                if (!list1.Contains(obj))
                    list1.Add(obj);
            }
            return list1;
        }
        public static DataTable ConvertTo<T>(IList<T> list)
        {
            DataTable table = CreateTable<T>();
            Type entityType = typeof(T);
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);

            foreach (T item in list)
            {
                DataRow row = table.NewRow();

                foreach (PropertyDescriptor prop in properties)
                {
                    object val = prop.GetValue(item);
                    if (val != null)
                        row[prop.Name] = val;
                }

                table.Rows.Add(row);
            }

            return table;
        }

        public static IList<T> ConvertTo<T>(IList<DataRow> rows)
        {
            IList<T> list = null;

            if (rows != null)
            {
                list = new List<T>();

                foreach (DataRow row in rows)
                {
                    T item = CreateItem<T>(row);
                    list.Add(item);
                }
            }

            return list;
        }

        public static IList<T> ConvertTo<T>(DataTable table)
        {
            if (table == null)
            {
                return null;
            }

            List<DataRow> rows = new List<DataRow>();

            foreach (DataRow row in table.Rows)
            {
                rows.Add(row);
            }

            return ConvertTo<T>(rows);
        }

        public static T CreateItem<T>(DataRow row)
        {
            T obj = default(T);
            if (row != null)
            {
                obj = Activator.CreateInstance<T>();

                foreach (DataColumn column in row.Table.Columns)
                {
                    PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName);
                    try
                    {
                        object value = row[column.ColumnName];
                        prop.SetValue(obj, value, null);
                    }
                    catch
                    {
                        // You can log something here
                        throw;
                    }
                }
            }

            return obj;
        }

        public static DataTable CreateTable<T>()
        {
            Type entityType = typeof(T);
            DataTable table = new DataTable(entityType.Name);
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);

            foreach (PropertyDescriptor prop in properties)
            {
                if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                {
                    NullableConverter converter = new NullableConverter(prop.PropertyType);
                    table.Columns.Add(prop.Name, converter.UnderlyingType);
                }
                else
                    table.Columns.Add(prop.Name, prop.PropertyType);
            }

            return table;
        }
    }
时间: 2024-11-05 13:28:44

一些DataTable和IList间转换的封装的相关文章

反射List&lt;M&gt; To DataTable|反射IList To DataTable|反射 DataTable To List&lt;M&gt;

将DataTable集合反射获取 List<M> /// <summary> /// 根据DataTable集合反射获取 List<M> /// </summary> /// <typeparam name="M">泛型实体</typeparam> /// <param name="dt">DataTable</param> /// <returns>实体集合

3.6 java基础总结①包装类,基本数据类型,String相互间转换

包装类,基本数据类型,String相互间转换 每个基本数据类型都有相对应的包装类型 包装类,基本数据类型,String相互间转换,这三者间的转换时很重要的: 一.String 转其他 String → 包装类型1.Integer(String str)调用包装类的带String参构造 String → 基本数据类型☆String → int调用包装类的parseInt方法 二.包装类转其他 → String调用包装类对象的ToString方法 → 基本类型①调用包装类的XXXValue方法包装类

各进制数间转换

#region 各进制数间转换 /// <summary> /// 实现各进制数间的转换.ConvertBase("15",10,16)表示将十进制数15转换为16进制的数. /// </summary> /// <param name="value">要转换的值,即原值</param> /// <param name="from">原值的进制,只能是2,8,10,16四个值.</

字符串,int,十六进制间转换

public class TypeConvert { 02. /* 字符串转byte[] 03. 这个方法转换后的结果是会多一些 48字符进来的就是代表的是0不知道为什么,但是可以只是取出指定的字符串就行了 04. */ 05. public static byte[] stringTo16Byte(String temp) { 06. 07. int len = temp.length(); 08. for (int i = 0; i < 16 - len; i++) { 09. if (te

Flex各类型坐标转换(全局、本地、内容坐标间转换)

Flex包含3种坐标:全局坐标.本地坐标.内容坐标 全局坐标:stage级别,坐标原点为舞台的左上角,如MouseEvent的stageX.stageY坐标. 本地坐标:组件级别的坐标系,相对坐标,坐标原点为相对的组件的左上角,如MouseEvent的localX.localY坐标,以及容器中组件的x.y属性都为本地相对坐标. 内容坐标:组件级别的坐标系,相对坐标,在有滚动条的情况下,全部内容所占的区域的坐标系,坐标原点为相对的组件的左上角,可以理解为包含滚动条的整个内容面板为一个坐标系.如组件

数据类型间转换

常用数据类型间转换 str--->list      split('') list-->str   str1 = 'x'.join(l1) str-->tuple   t1 = tuple(str1) list-->tuple   t1 = tuple(l1) 字符串---->字典 a='{"name":"yct","age":10}' print(a)   # {"name":"yct

datatable to list 方法转换

#region 实体转换 /// <summary> /// add extension method for datable /// </summary> /// <param name="dt"></param> /// <returns></returns> public static IList<TEntity> ToList<TEntity>(this DataTable dt)

datatable和list的转换

在开发中,把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有list<T>检索方便.但是数据以ILIST形式返回,就为我们在.NET中使用传统的数据绑定造成了不便.下面介绍datatable和list的相互转换 1.datatable转换为list public List<T> GetList<T>(DataTable table) { List<T> list = new List<T>(); T t = default(

进制间转换

 B(Binary)二进制.O(Octet)八进制.D(Decimal)十进制.H(Hex)十六进制 进制转换: 1.十进制to N进制 以十进制数/N,其结果再/N,直至结果为0,然后从后往前取每次除法结果余数即可. 例如:20000转16进制 20000/16=1250       余0, 1250/16=78             余2, 78/16=4                  余14(E) 4/16=0 余4 所以结果是:4E20H 2.N进制to 十进制(由于十进制更符合普