实体类,初探反射(一)之反射填充实体类

首先反射是干什么用的?它可以获得程序集中的公共字段,属性,方法,事件,接口等等,我们知道程序集里一般包含CIL代码,元数据,程序集清单。其中元数据描述了程序集里面的属性方法等等,而反射则是来操作元数据。 本例我们是用SQL Server 使用里面的PUBS 数据库中的Jobs表。

首先我们来创建一个实体类



using System; using System.Collections.Generic; using System.Text; namespace Model { [Serializable] public class Jobs { //自动生成字段 private string job_desc; private short job_id; private byte max_lvl; private byte min_lvl; //自动生成默认无参构造函数 public Jobs() { } //自动生成全参参构造函数 public Jobs(string job_desc, short job_id, byte max_lvl, byte min_lvl) { this.job_desc = job_desc; this.job_id = job_id; this.max_lvl = max_lvl; this.min_lvl = min_lvl; } //自动生成属性 public string Job_desc { get { return job_desc;} set { job_desc = value;} } public short Job_id { get { return job_id;} set { job_id = value;} } public byte Max_lvl { get { return max_lvl;} set { max_lvl = value;} } public byte Min_lvl { get { return min_lvl;} set { min_lvl = value;} } } }



这就是一个由生成工具生成的实体类,这里没有什么好说的,让我么你来看看下面这段代码:



static void Main(string[] args) { Model.Jobs job = new Jobs(); job = GetModel<Model.Jobs>(job, 2,"job_id"); PropertyInfo[] pro = job.GetType().GetProperties(); foreach (PropertyInfo p in pro) { Console.WriteLine(p.GetValue(job, null)); } Console.WriteLine("*******************************"); }





这段代码 我们给泛型的GetModel的方法传入了一个实体,要查询的id号和主键字段,然后返回了一个实体 ,输出实体的每个属性发现都被填充了 那么这是怎么实现的呢? 接着往下看看。



public static DataSet GetConn(short s,string table,string d) { DataSet ds = new DataSet(); string con = "server=.;uid=sa;pwd=sa;database=pubs"; using(SqlConnection conn = new SqlConnection(con)) { conn.Open(); using (SqlDataAdapter sda = new SqlDataAdapter()) { string text = "select * from "+table+" where "+d+"=" + s.ToString(); SqlCommand cmd = new SqlCommand(text); cmd.Connection = conn; sda.SelectCommand = cmd; sda.Fill(ds); } } return ds; }



这是一段连接字符串的代码,写的比较糟糕。呵呵讲究看看吧。这个方法返回的是DataSet



,使用USING关键字在离开作用域的时候会自动调用dispose的方法来释放连接。 好了不多说了 这段代码也不是我们需要研究的。看看下面吧!~



public static T GetModel<T>(T t,short id,string SelectCol) where T:new() //泛型方法 New 约束 { T s = new T(); Type ty = s.GetType(); PropertyInfo[] pry = ty.GetProperties(); DataSet ds = GetConn(id, t.GetType().Name, SelectCol); if (ds != null && ds.Tables.Count>0) { for (int i = 0; i < pry.Length; i++) { if (pry[i].PropertyType.IsEnum) { pry[i].SetValue(s, Enum.ToObject(pry[i].PropertyType, ds.Tables[0].Rows[0][pry[i].Name]), null); } else { pry[i].SetValue(s,ds.Tables[0].Rows[0][pry[i].Name], null); } } } return s; }





这段代码 才是关键 首先 这是一个泛型的方法 给这个泛型的方法一个NEW()约束,具体泛型的东西我们以后再讨论。

这里我们使用了一个GETTYPE的方法来获得 类型,这里要提到,System.Type 这个类在反射中至关重要。接下来 使用了一个GetProperties()的方法来返回程序集中公共属性的集合。接下来是调用了刚才的连接的方法 返回了一个DATASET,然后使用属性的SETVALUE的方法来个实体类赋值,然后返回实体类。是不是很简单呢 呵呵,最后要注意 使用反射要引用System.Reflection命名空间,或者使用完全限定名。

Tags:  实体类生成器 动态生成实体类 java实体类 抽象类继承实体类 什么是实体类 实体类

延伸阅读

最新评论

发表评论