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

    技术2022-05-20  42

    以上代码,经过优化后,速度几乎和直接用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的一倍左右,可以接受


    最新回复(0)