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

本文转载:CSDN博客