C#DataTable转List<T>互转
阅读原文时间:2023年07月08日阅读:1

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

namespace BT.Preservation.Models
{
public static class ExtendMethod
{
///

/// DataTable转成List ///
///
///
///
public static List ToDataList(this DataTable dt)
{
var list = new List();
var plist = new List(typeof(T).GetProperties());
foreach (DataRow item in dt.Rows)
{
T s = Activator.CreateInstance();
for (int i = ; i < dt.Columns.Count; i++) { PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
if (info != null)
{
try
{
if (!Convert.IsDBNull(item[i]))
{
object v = null;
if (info.PropertyType.ToString().Contains("System.Nullable"))
{
v = Convert.ChangeType(item[i], Nullable.GetUnderlyingType(info.PropertyType));
}
else
{
v = Convert.ChangeType(item[i],info.PropertyType);
}
info.SetValue(s, v, null);
}
}
catch (Exception ex)
{
throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message);
}
}
}
list.Add(s);
}
return list;
}

    /// <summary>  
    /// DataTable转成Dto  
    /// </summary>  
    /// <typeparam name="T"></typeparam>  
    /// <param name="dt"></param>  
    /// <returns></returns>  
    public static T ToDataDto<T>(this DataTable dt)  
    {  
        T s = Activator.CreateInstance<T>();  
        if (dt == null || dt.Rows.Count == )  
        {  
            return s;  
        }  
        var plist = new List<PropertyInfo>(typeof(T).GetProperties());  
        for (int i = ; i < dt.Columns.Count; i++)  
        {  
            PropertyInfo info = plist.Find(p => p.Name == dt.Columns\[i\].ColumnName);  
            if (info != null)  
            {  
                try  
                {  
                    if (!Convert.IsDBNull(dt.Rows\[\]\[i\]))  
                    {  
                        object v = null;  
                        if (info.PropertyType.ToString().Contains("System.Nullable"))  
                        {  
                            v = Convert.ChangeType(dt.Rows\[\]\[i\], Nullable.GetUnderlyingType(info.PropertyType));  
                        }  
                        else  
                        {  
                            v = Convert.ChangeType(dt.Rows\[\]\[i\], info.PropertyType);  
                        }  
                        info.SetValue(s, v, null);  
                    }  
                }  
                catch (Exception ex)  
                {  
                    throw new Exception("字段\[" + info.Name + "\]转换出错," + ex.Message);  
                }  
            }  
        }  
        return s;  
    }

    /// <summary>  
    /// 将实体集合转换为DataTable  
    /// </summary>  
    /// <typeparam name="T">实体类型</typeparam>  
    /// <param name="entities">实体集合</param>  
    public static DataTable ToDataTable<T>(List<T> entities)  
    {  
        var result = CreateTable<T>();  
        FillData(result, entities);  
        return result;  
    }

    /// <summary>  
    /// 创建表  
    /// </summary>  
    private static DataTable CreateTable<T>()  
    {  
        var result = new DataTable();  
        var type = typeof(T);  
        foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))  
        {  
            var propertyType = property.PropertyType;  
            if ((propertyType.IsGenericType) && (propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)))  
                propertyType = propertyType.GetGenericArguments()\[\];  
            result.Columns.Add(property.Name, propertyType);  
        }  
        return result;  
    }

    /// <summary>  
    /// 填充数据  
    /// </summary>  
    private static void FillData<T>(DataTable dt, IEnumerable<T> entities)  
    {  
        foreach (var entity in entities)  
        {  
            dt.Rows.Add(CreateRow(dt, entity));  
        }  
    }

    /// <summary>  
    /// 创建行  
    /// </summary>  
    private static DataRow CreateRow<T>(DataTable dt, T entity)  
    {  
        DataRow row = dt.NewRow();  
        var type = typeof(T);  
        foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))  
        {  
            row\[property.Name\] = property.GetValue(entity) ?? DBNull.Value;  
        }  
        return row;  
    }  
}  

}