zoukankan      html  css  js  c++  java
  • 通过反射动态实填充实体类

    第一种:检测整个实体类

    using System;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Reflection;
    using System.Data;

    public partial class bangsotest_dr : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            IList<user> userlist;
            string sqlcmd = "select top 1000 Username,Password from userinfo order by id";//这里的Username和Password会根据实体类中的对应字段,自动填充或跳过
            using (SqlDataReader dr = Bangso.DBUtility.SQLHelper.ExecuteDataReader(sqlcmd))
            {
                userlist = FillEntityFromReader<user>(dr);
            }

            foreach (user u in userlist)
            {
                Response.Write(u.Username + "<br>");
            }
        }

        public static IList<T> FillEntityFromReader<T>(SqlDataReader reader)
        {
            List<T> list = new List<T>();
            List<PropertyInfo> pinfoList = new List<PropertyInfo>();
            Boolean checkedPropertyInfo = false;
            while (reader.Read())
            {
                T instance = Activator.CreateInstance<T>();

                #region 检查数据库字段与实体类属性的匹配情况
                if (!checkedPropertyInfo)
                {
                    foreach (PropertyInfo pinfo in typeof(T).GetProperties())
                    {
                        //判断reader是否有此Property中的BoundFieldAttribute所对应需要绑定的字段
                        if (reader.GetSchemaTable().Select("ColumnName='" + pinfo.Name + "'").Length > 0)
                        {
                            pinfoList.Add(pinfo);
                        }
                    }
                }
                #endregion

                //查检完成
                checkedPropertyInfo = true;

                //开始赋值
                foreach (PropertyInfo info in pinfoList)
                {
                    int index = reader.GetOrdinal(info.Name);
                    if (reader.GetValue(index) != DBNull.Value)
                    {
                        if (!info.PropertyType.IsEnum)
                        {
                            info.SetValue(instance, Convert.ChangeType(reader.GetValue(index), info.PropertyType), null);
                        }
                        else
                        {
                            info.SetValue(instance, Enum.Parse(info.PropertyType, reader.GetValue(index).ToString()), null);
                        }
                    }
                }

                list.Add(instance);
            }
            reader.Close();
            return list;
        }

        public class user
        {
            string username;
            public string Username
            {
                get { return username; }
                set { username = value; }
            }
        }
    }

     第二种根据实体类中的特性来选择填充哪些属性

    using System;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Reflection;

    public partial class bangsotest_dr : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            IList<user> userlist;
            string sqlcmd = "select top 100 username from userinfo";
            using (SqlDataReader dr = Bangso.DBUtility.SQLHelper.ExecuteDataReader(sqlcmd))
            {
                userlist = FillEntityFromReader<user>(dr);
            }

            foreach (user ui in userlist)
            {
                Response.Write(ui.Username + "<br>");
            }
        }

        public static IList<T> FillEntityFromReader<T>(SqlDataReader reader)
        {
            List<T> list = new List<T>();
            List<PropertyInfo> pinfoList = new List<PropertyInfo>();
            Boolean checkedPropertyInfo = false;
            while (reader.Read())
            {
                T instance = Activator.CreateInstance<T>();
                #region 检查数据库字段与实体类属性的匹配情况
                if (!checkedPropertyInfo)
                {
                    foreach (PropertyInfo pinfo in typeof(T).GetProperties())
                    {
                        foreach (BoundFieldAttribute attr in pinfo.GetCustomAttributes(typeof(BoundFieldAttribute), true))
                        {
                            //判断reader是否有此Property中的BoundFieldAttribute所对应需要绑定的字段
                            if (reader.GetSchemaTable().Select("ColumnName='" + attr.FieldName + "'").Length > 0)
                            {
                                pinfoList.Add(pinfo);
                            }
                        }
                    }
                }
                #endregion

                //查检完成
                checkedPropertyInfo = true;

                //开始赋值
                foreach (PropertyInfo info in pinfoList)
                {
                    int index = reader.GetOrdinal(info.Name);
                    if (reader.GetValue(index) != DBNull.Value)
                    {
                        if (!info.PropertyType.IsEnum)
                        {
                            info.SetValue(instance, Convert.ChangeType(reader.GetValue(index), info.PropertyType), null);
                        }
                        else
                        {
                            info.SetValue(instance, Enum.Parse(info.PropertyType, reader.GetValue(index).ToString()), null);
                        }
                    }
                }

                list.Add(instance);
            }
            return list;
        }

        public class BoundFieldAttribute : Attribute
        {
            private string fieldName;

            /// <summary>
            
    /// 指定绑定的数据库字段名
            
    /// </summary>
            public string FieldName
            {
                get { return fieldName; }
            }

            /// <summary>
            
    /// 初始化一个特性
            
    /// </summary>
            
    /// <param name="_fieldName">数据库字段名</param>
            public BoundFieldAttribute(string _fieldName)
            {
                this.fieldName = _fieldName;
            }
        }

        public class user
        {
            string username, password;
            [BoundFieldAttribute("Username")]//这里的特性声明一定要,否则将无法绑定
            public string Username
            {
                get { return username; }
                set { username = value; }
            }
            
            public string Password//这里的Password将不会被填充,因为它没有声明特性
            {
                get { return password; }
                set { password = value; }
            }
        }
    }
  • 相关阅读:
    hbase scan超时问题
    hadoop的shuffle和排序
    MapReduce作业的调度
    hadoop hdfs问题集锦
    JVM--双亲委派机制
    springboot快速搭建
    CircleView
    TabHost实现底部导航栏
    GridView的stretchMode属性
    Android直连SQL Server数据库
  • 原文地址:https://www.cnblogs.com/yeagen/p/2188317.html
Copyright © 2011-2022 走看看