博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on 2010-11-24 14:25  Mr.X  阅读(5331)  评论(30编辑  收藏  举报

首先反射是干什么用的?它可以获得程序集中的公共字段,属性,方法,事件,接口等等,我们知道程序集里一般包含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命名空间,或者使用完全限定名。

 

本文属原创欢迎转载

转载请注明原文出处!~http://www.cnblogs.com/xylasp

欢迎加关注 呵呵