DataTable和IList间转换的封装

一些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;
        }
    }

posted @ 2010-01-08 14:20  KissFly  Views(1783)  Comments(1)    收藏  举报