利用反射将Datatable、SqlDataReader转换成List模型

1. DataTable转IList

public class DataTableToList<T>whereT :new() 
 {

 ///<summary>

 ///利用反射将Datatable转换成List模型

 ///</summary>

 ///<param name="dt"></param>

 ///<returns></returns>

public static List<T> ConvertToList(DataTabledt) 
 {

 List<T> list =newList<T>();

 Typetype =typeof(T);

 stringtempName =string.Empty;

 foreach(DataRowdrindt.Rows)
 {

 T t =newT();

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

 foreach(PropertyInfopiinpropertys)
 {

 tempName = pi.Name;

 if(dt.Columns.Contains(tempName))

 {

 if(!pi.CanWrite)

 {

 continue;

 }

 var value = dr[tempName];

 if(value !=DBNull.Value)

 {

 pi.SetValue(t, value,null);

 }

 }

 }
 list.Add(t);
 }
 returnlist;
 } 
}

2. SqlDataReader转IList

/// <summary>
/// 判断SqlDataReader是否存在某列
/// </summary>
/// <param name="dr">SqlDataReader</param>
/// <param name="columnName">列名</param>
/// <returns></returns>
private bool readerExists(SqlDataReader dr, string columnName)
{

    dr.GetSchemaTable().DefaultView.RowFilter = "ColumnName= '" + columnName + "'";

    return (dr.GetSchemaTable().DefaultView.Count > 0);

}

///<summary>
///利用反射和泛型将SqlDataReader转换成List模型
///</summary>
///<param name="sql">查询sql语句</param>
///<returns></returns>

public IList<T> ExecuteToList<T>(string sql) where T : new()

{
    IList<T> list;

    Type type = typeof (T);

    string tempName = string.Empty;

    using (SqlDataReader reader = ExecuteReader(sql))
    {
        if (reader.HasRows)
        {
            list = new List<T>();
            while (reader.Read())
            {
                T t = new T();

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

                foreach (PropertyInfo pi in propertys)
                {
                    tempName = pi.Name;

                    if (readerExists(reader, tempName))
                    {
                        if (!pi.CanWrite)
                        {
                            continue;
                        }
                        var value = reader[tempName];

                        if (value != DBNull.Value)
                        {
                            pi.SetValue(t, value, null);
                        }

                    }

                }

                list.Add(t);

            }
            return list;
        }
    }
    return null;
}

3、结果集从存储过程获取

 /// <summary>
 /// 处理存储过程
 /// </summary>
 /// <param name="spName">存储过程名</param>
 /// <param name="parameters">参数数组</param>
 /// <returns>sql数据流</returns>
 protected virtual SqlDataReader ExecuteReaderSP(string spName, ArrayList parameters)
 {
     SqlDataReader result = null;
     cmd.CommandText = spName;
     cmd.CommandType = CommandType.StoredProcedure;
     cmd.Parameters.Clear();
     if (parameters != null)
     {
         foreach (SqlParameter param in parameters)
         {
             cmd.Parameters.Add(param);
         }
     }
     try
     {
         Open();
         result = cmd.ExecuteReader(CommandBehavior.CloseConnection);
     }
     catch (Exception e)
     {
         if (result != null && (!result.IsClosed))
         {
             result.Close();
         }
         LogHelper.WriteLog("\r\n方法异常【ExecuteReaderSP(string spName, ArrayList parameters)】" + spName, e);
         throw new Exception(e.Message);
     }
     return result;
 }
///<summary>
///利用反射将SqlDataReader转换成List模型
///</summary>
///<param name="spName">存储过程名称</param>
///<returns></returns>

public IList<T> ExecuteQueryListSP<T>(string spName, params SqlParameter[] listParams) where T : new()
{
    IList<T> list;

    Type type = typeof(T);

    string tempName = string.Empty;

    using (SqlDataReader reader = ExecuteReaderSP(spName, new ArrayList(listParams)))
    {
        if (reader.HasRows)
        {
            list = new List<T>();
            while (reader.Read())
            {
                T t = new T();

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

                foreach (PropertyInfo pi in propertys)
                {
                    tempName = pi.Name;

                    //for (int intField = 0; intField < reader.FieldCount; intField++)
                    //{//遍历该列名是否存在
                    //}

                    if (readerExists(reader, tempName))
                    {
                        if (!pi.CanWrite)
                        {
                            continue;
                        }
                        var value = reader[tempName];

                        if (value != DBNull.Value)
                        {
                            pi.SetValue(t, value, null);
                        }

                    }

                }

                list.Add(t);

            }
            return list;
        }
    }
    return null;
}
好的,我可以回答你的问题。利用反射可以实现 DataTableList<T> 之间的转换。 首先,我们需要定义一个通用的方法,该方法可以将 List<T> 转换为 DataTable,也可以将 DataTable 转换为 List<T>。该方法的实现需要借助反射机制。 下面是将 List<T> 转换为 DataTable 的代码: ```csharp public static DataTable ConvertToDataTable<T>(List<T> list) { DataTable table = new DataTable(); PropertyInfo[] properties = typeof(T).GetProperties(); foreach (PropertyInfo property in properties) { table.Columns.Add(property.Name, property.PropertyType); } foreach (T item in list) { DataRow row = table.NewRow(); foreach (PropertyInfo property in properties) { row[property.Name] = property.GetValue(item, null); } table.Rows.Add(row); } return table; } ``` 上面的代码中,我们首先使用反射机制获取类型 T 的所有属性信息,然后使用这些属性信息创建 DataTable 的列。接着,我们遍历 List<T> 中的每个元素,使用反射获取元素的属性值,并将这些属性值添加到 DataRow 中,最后将 DataRow 添加到 DataTable 中。 下面是将 DataTable 转换为 List<T> 的代码: ```csharp public static List<T> ConvertToList<T>(DataTable table) where T : new() { List<T> list = new List<T>(); PropertyInfo[] properties = typeof(T).GetProperties(); foreach (DataRow row in table.Rows) { T item = new T(); foreach (PropertyInfo property in properties) { if (table.Columns.Contains(property.Name)) { property.SetValue(item, row[property.Name], null); } } list.Add(item); } return list; } ``` 上面的代码中,我们同样使用反射机制获取类型 T 的所有属性信息,然后遍历 DataTable 中的每个 DataRow,使用反射设置每个 DataRow 中对应的属性值,并将 T 对象添加到 List<T> 中。 希望这些代码可以帮助你解决问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值