.net反射实例(再次优化后)

来源:互联网 发布:java建立一个数组 编辑:程序博客网 时间:2024/04/29 21:32

以上代码,经过优化后,速度几乎和直接用reader读出来差不多,但没解决第二个问题,model中的属性值还是必须和数据库表中的字段名完全一样,下面是再次改进后的代码:

/// <summary>

        /// 分页查询;函数中,存储过程参数含义见接口文档

        /// </summary>

        /// <param name="table_Name">表或视图名</param>

        /// <param name="Fields">字段列表,“*”为全部字段</param>

        /// <param name="limit_Condition">where条件(不用带where)</param>

        /// <param name="order_By">排序关键字(不用带order by)</param>

        /// <param name="order_Direction">查询顺序(升序asc或降序desc)</param>

        /// <param name="page_Size">每页显示条数</param>

        /// <param name="current_Page">当前页码</param>

        /// <returns>返回一个数据集</returns>

        public List<Model.Ppt> Select(string table_Name, string Fields, string limit_Condition, string order_By, string order_Direction, int page_Size, int current_Page)

        {

            SqlParameter[] para = new SqlParameter[7];

            para[0] = new SqlParameter("@TableName", table_Name);

            para[1] = new SqlParameter("@ReFieldsStr", Fields);

            para[2] = new SqlParameter("@OrderString", order_By);

            para[3] = new SqlParameter("@OrderDirection", order_Direction);

            para[4] = new SqlParameter("@WhereString", limit_Condition);

            para[5] = new SqlParameter("@PageSize", page_Size);

            para[6] = new SqlParameter("@PageIndex ", current_Page);

 

            List<Model.Ppt> list = new List<Model.Ppt>();

            Hashtable hashValue = new Hashtable();

            Model.Ppt model = new Model.Ppt();

            object temp=new Model.Ppt();

            object[] objPptFieldAttribute = null; 

            int fieldNum = 18;

            PropertyInfo[] infos = model.GetType().GetProperties();

            string[] field = Fields.Split(',');

using (SqlDataReader reader = SQLHelper.ExecuteReader(conn, CommandType.StoredProcedure, "PROCE_PAGECHANGE", para))

            {

                while (reader.Read())

                {

                    hashValue = new Hashtable();

                    temp = new Model.Ppt();

                    foreach (string fName in field)

                    {

                        for (int i = 0; i < fieldNum; i++)

                        {

                            if ("*" == fName)

                            {

                                objPptFieldAttribute = infos.GetCustomAttributes(typeof(Map.PptFieldAttribute), false);

                                if (objPptFieldAttribute != null)

                                {

                                    if (DBNull.Value != reader[infos.Name])

                                    {

                                        hashValue.Add(infos.Name, reader[((Map.PptFieldAttribute)objPptFieldAttribute[0]).FieldName]);

                                        infos.SetValue(temp, hashValue[infos.Name], null);

                                    }

                                } 

                            }

                            else

                            {

                                if (infos.Name == fName)

                                {

                                    objPptFieldAttribute = infos.GetCustomAttributes(typeof(Map.PptFieldAttribute), false);

                                    if (objPptFieldAttribute != null)

                                    {

                                        if (DBNull.Value != reader[infos.Name])

                                        {

                                            hashValue.Add(infos.Name, reader[((Map.PptFieldAttribute)objPptFieldAttribute[0]).FieldName]);

                                            infos.SetValue(temp, hashValue[infos.Name], null);

                                        }

                                    } 

                                    break;

                                }

                            }

                        }

                    }

                    list.Add((Model.Ppt)temp);

                }

            }

            return list;

        }

Model

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Map;

namespace Model
{
    public class Ppt : IComparable<Ppt>
    {
        //课件Id
        private int _Ppt_Id;
        [PptField("Ppt_Id","int")]
        public int Ppt_Id
        {
            get { return _Ppt_Id; }
            set { _Ppt_Id = value; }
        }
        //课件名
        private string _Ppt_Name;
        [PptField("Ppt_Name", "nvarchar")]
        public string Ppt_Name
        {
            get { return _Ppt_Name; }
            set { _Ppt_Name = value; }
        }
        //作者
        private string _Ppt_Author;
        [PptField("Ppt_Author", "nvarchar")]
        public string Ppt_Author
        {
            get { return _Ppt_Author; }
            set { _Ppt_Author = value; }
        }
        //课件长度
        private string _Ppt_Length;
        [PptField("Ppt_Length", "nvarchar")]
        public string Ppt_Length
        {
            get { return _Ppt_Length; }
            set { _Ppt_Length = value; }
        }
        //所属目录
        private string _Ppt_Catalog;
        [PptField("Ppt_Catalog", "nvarchar")]
        public string Ppt_Catalog
        {
            get { return _Ppt_Catalog; }
            set { _Ppt_Catalog = value; }
        }
        //发布范围
        private string _Ppt_Range;
        [PptField("Ppt_Range", "nvarchar")]
        public string Ppt_Range
        {
            get { return _Ppt_Range; }
            set { _Ppt_Range = value; }
        }
        //描述
        private string _Ppt_Description;
        [PptField("Ppt_Description", "text")]
        public string Ppt_Description
        {
            get { return _Ppt_Description; }
            set { _Ppt_Description = value; }
        }
        //WebExame链接
        private string _Ppt_WebExameLink;
        [PptField("Ppt_WebExameLink", "nvarchar")]
        public string Ppt_WebExameLink
        {
            get { return _Ppt_WebExameLink; }
            set { _Ppt_WebExameLink = value; }
        }

//课件路径
        private string _Ppt_Path;
        [PptField("Ppt_Path", "nvarchar")]
        public string Ppt_Path
        {
            get { return _Ppt_Path; }
            set { _Ppt_Path = value; }
        }
        //题目截图
        private string _Ppt_TopicImage;
        [PptField("Ppt_TopicImage", "nvarchar")]
        public string Ppt_TopicImage
        {
            get { return _Ppt_TopicImage; }
            set { _Ppt_TopicImage = value; }
        }
        //讲师截图
        private string _Ppt_LecImage;
        [PptField("Ppt_LecImage", "nvarchar")]
        public string Ppt_LecImage
        {
            get { return _Ppt_LecImage; }
            set { _Ppt_LecImage = value; }
        }
        //目录截图
        private string _Ppt_CatalogImage;
        [PptField("Ppt_CatalogImage", "nvarchar")]
        public string Ppt_CatalogImage
        {
            get { return _Ppt_CatalogImage; }
            set { _Ppt_CatalogImage = value; }
        }
        //课件顺序
        private int _Ppt_Order;
        [PptField("Ppt_Order", "int")]
        public int Ppt_Order
        {
            get { return _Ppt_Order; }
            set { _Ppt_Order = value; }
        }
        //平均分数
        private int _Ppt_Score;
        [PptField("Ppt_Score", "int")]
        public int Ppt_Score
        {
            get { return _Ppt_Score; }
            set { _Ppt_Score = value; }
        }
        //有效点击数
        private int _Ppt_Click;
        [PptField("Ppt_Click", "int")]
        public int Ppt_Click
        {
            get { return _Ppt_Click; }
            set { _Ppt_Click = value; }
        }

Map:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Map
{
    public class PptFieldAttribute:Attribute
    {
        private string _FieldName;
        private string _FieldType;
     
        public PptFieldAttribute(string fieldname,string fieldtype)
        {
            this._FieldName = fieldname;
            this._FieldType = fieldtype;
        }

        /// <summary>
        /// 字段名
        /// </summary>
        public string FieldName
        {
            get { return this._FieldName; }
        }

        /// <summary>
        /// 字段类型
        /// </summary>
        public string FieldType
        {
            get { return this._FieldType; }
            set { this._FieldType = value; }
        }

       
    }
}

本次优化把两个问题都解决了,速度是直接reader的一倍左右,可以接受

原创粉丝点击