/// <summary>
        /// IDataReader转泛型IList(纯反射,无需定义Entity的GetFrom)
        /// </summary>
        /// <typeparam name="T">泛型实体T</typeparam>
        /// <param name="dataReader">DataReader对象</param>
        /// <returns></returns>
        public static List <T> ToAnyList <T>(this IDataReader dataReader) where T : class, new()
        {
            var ls = new List <T>();
            //获取传入的数据类型
            var t = typeof(T);

            if (dataReader != null && !dataReader.IsClosed)
            {
                //遍历DataReader对象
                while (dataReader.Read())
                {
                    //使用与指定参数匹配最高的构造函数,来创建指定类型的实例
                    var entity = Activator.CreateInstance <T>();
                    for (var i = 0; i < dataReader.FieldCount; i++)
                    {
                        //判断字段值是否为空或不存在的值
                        if (!BaseUtil.IsNullOrDbNull(dataReader[i]))
                        {
                            //匹配字段名
                            var pi = t.GetProperty(dataReader.GetName(i), BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                            if (pi != null)
                            {
                                //绑定实体对象中同名的字段
                                pi.SetValue(entity, BaseUtil.ChangeType(dataReader[i], pi.PropertyType), null);
                            }
                        }
                    }
                    ls.Add(entity);
                }
                dataReader.Close();
            }
            return(ls);
        }
 /// <summary>
 /// IDataReader(while (dataReader.Read()){}中使用)循环读取转实体(纯反射,无需定义Entity的GetFrom)
 /// </summary>
 /// <typeparam name="T">T</typeparam>
 /// <param name="dataReader">IDataReader对象</param>
 /// <returns></returns>
 public static T ToAnyEntity <T>(this IDataReader dataReader)
 {
     if (dataReader != null && !dataReader.IsClosed)
     {
         var entity = Activator.CreateInstance <T>();
         while (dataReader.Read())
         {
             var t     = typeof(T);
             var count = dataReader.FieldCount;
             for (var i = 0; i < count; i++)
             {
                 if (!BaseUtil.IsNullOrDbNull(dataReader[i]))
                 {
                     var pi = t.GetProperty(dataReader.GetName(i), BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                     if (pi != null)
                     {
                         pi.SetValue(entity, BaseUtil.ChangeType(dataReader[i], pi.PropertyType), null);
                     }
                 }
             }
         }
         dataReader.Close();
         return(entity);
     }
     else
     {
         return(default(T));
     }
 }
        /// <summary>
        /// 获取数据表
        /// 这个方法按道理目标数据不会非常大,所以可以不优化,问题不大
        /// </summary>
        /// <param name="dbHelper">数据库连接</param>
        /// <param name="tableName">目标表名</param>
        /// <param name="name">字段名</param>
        /// <param name="values">字段值</param>
        /// <param name="targetField">目标字段</param>
        /// <returns>数据表</returns>
        public static string[] GetProperties(this IDbHelper dbHelper, string tableName, string name, Object[] values, string targetField)
        {
            var sb = Pool.StringBuilder.Get();

            sb.Append("SELECT " + targetField + " FROM " + tableName + "  WHERE " + name + " IN (" + string.Join(",", values) + ")");
            var dt = dbHelper.Fill(sb.Put());

            return(BaseUtil.FieldToArray(dt, targetField).Distinct <string>().Where(t => !string.IsNullOrEmpty(t)).ToArray());
        }
        /// <summary>
        /// SwapDyn
        /// </summary>
        /// <param name="lstT"></param>
        /// <param name="id"></param>
        /// <param name="targetId"></param>
        /// <returns></returns>
        public static int SwapDyn(dynamic lstT, string id, string targetId)
        {
            var    result         = 0;
            string sortCode       = BaseUtil.GetPropertyDyn(lstT, id, BaseUtil.FieldSortCode);
            string targetSortCode = BaseUtil.GetPropertyDyn(lstT, targetId, BaseUtil.FieldSortCode);

            result  = BaseUtil.SetPropertyDyn(lstT, id, BaseUtil.FieldSortCode, targetSortCode);
            result += BaseUtil.SetPropertyDyn(lstT, targetId, BaseUtil.FieldSortCode, sortCode);
            return(result);
        }
        /// <summary>
        /// 两条记录交换排序顺序
        /// </summary>
        /// <param name="dt">数据表</param>
        /// <param name="id">要移动的记录主键</param>
        /// <param name="targetId">目标记录主键</param>
        /// <returns>影响行数</returns>
        public static int Swap(DataTable dt, string id, string targetId)
        {
            var result         = 0;
            var sortCode       = BaseUtil.GetProperty(dt, id, BaseUtil.FieldSortCode);
            var targetSortCode = BaseUtil.GetProperty(dt, targetId, BaseUtil.FieldSortCode);

            result  = BaseUtil.SetProperty(dt, id, BaseUtil.FieldSortCode, targetSortCode);
            result += BaseUtil.SetProperty(dt, targetId, BaseUtil.FieldSortCode, sortCode);
            return(result);
        }
 /// <summary>
 /// 获取父子节点列表
 /// </summary>
 /// <param name="dbHelper">数据库连接</param>
 /// <param name="tableName">目标表明</param>
 /// <param name="fieldCode">编码字段</param>
 /// <param name="code">编码</param>
 /// <param name="order">排序</param>
 /// <returns>主键数组</returns>
 public static string[] GetParentChildrensIdByCode(this IDbHelper dbHelper, string tableName, string fieldCode, string code, string order)
 {
     return(BaseUtil.FieldToArray(GetParentChildrensByCode(dbHelper, tableName, fieldCode, code, order, true), BaseUtil.FieldId).Distinct <string>().Where(t => !string.IsNullOrEmpty(t)).ToArray());
 }
        /// <summary>
        /// DataTable转泛型(纯反射,无需定义Entity的GetFrom)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dt">DataTable</param>
        /// <returns></returns>
        public static List <T> ToAnyList <T>(this DataTable dt) where T : class, new()
        {
            var t          = typeof(T);
            var properties = t.GetProperties();
            var ls         = new List <T>();

            if (dt != null && dt.Rows.Count > 0)
            {
                foreach (DataRow dr in dt.Rows)
                {
                    T entity = new T();
                    foreach (var pi in properties)
                    {
                        var typeName = pi.Name;
                        if (dt.Columns.Contains(typeName))
                        {
                            if (!pi.CanWrite)
                            {
                                continue;
                            }
                            var value = dr[typeName];
                            if (value == DBNull.Value)
                            {
                                continue;
                            }
                            if (pi.PropertyType == typeof(string))
                            {
                                pi.SetValue(entity, value.ToString(), null);
                            }
                            else if (pi.PropertyType == typeof(int))
                            {
                                pi.SetValue(entity, BaseUtil.ConvertToInt(value), null);
                            }
                            else if (pi.PropertyType == typeof(int?))
                            {
                                pi.SetValue(entity, BaseUtil.ConvertToNullableInt(value), null);
                            }
                            else if (pi.PropertyType == typeof(long))
                            {
                                pi.SetValue(entity, BaseUtil.ConvertToLong(value), null);
                            }
                            else if (pi.PropertyType == typeof(long?))
                            {
                                pi.SetValue(entity, BaseUtil.ConvertToNullableLong(value), null);
                            }
                            else if (pi.PropertyType == typeof(DateTime))
                            {
                                pi.SetValue(entity, BaseUtil.ConvertToDateTime(value), null);
                            }
                            else if (pi.PropertyType == typeof(DateTime?))
                            {
                                pi.SetValue(entity, BaseUtil.ConvertToNullableDateTime(value), null);
                            }
                            else if (pi.PropertyType == typeof(float))
                            {
                                pi.SetValue(entity, BaseUtil.ConvertToFloat(value), null);
                            }
                            else if (pi.PropertyType == typeof(float?))
                            {
                                pi.SetValue(entity, BaseUtil.ConvertToNullableFloat(value), null);
                            }
                            else if (pi.PropertyType == typeof(double?))
                            {
                                pi.SetValue(entity, BaseUtil.ConvertToDouble(value), null);
                            }
                            else if (pi.PropertyType == typeof(double?))
                            {
                                pi.SetValue(entity, BaseUtil.ConvertToNullableDouble(value), null);
                            }
                            else if (pi.PropertyType == typeof(decimal))
                            {
                                pi.SetValue(entity, BaseUtil.ConvertToDecimal(value), null);
                            }
                            else if (pi.PropertyType == typeof(decimal?))
                            {
                                pi.SetValue(entity, BaseUtil.ConvertToNullableDecimal(value), null);
                            }
                            else
                            {
                                pi.SetValue(entity, BaseUtil.ChangeType(value, pi.PropertyType), null);
                            }
                        }
                    }
                    ls.Add(entity);
                }
            }
            return(ls);
        }