首先反射是干什么用的?它可以获得程序集中的公共字段,属性,方法,事件,接口等等,我们知道程序集里一般包含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
欢迎加关注 呵呵