您的位置:首页 > 编程语言 > C#

c# 反射在ORM中的应用

2017-05-10 20:51 225 查看
ORM给数据库编程带来了极大的便利和灵活性,实现ORM一般需要用到反射,本文介绍c# 反射在ORM中的应用。

在ORM编程中,一般把表或视图映射为一个类,把字段作为属性来使用,从数据库表或视图读取的数据需要映射到类的属性中,在更新数据库时也要读取类的属性的值,通过反射就能做到这些。

假设主键字段在类中加上FPK_前缀来命名,其它字段加上FI_前缀来命名,那么tblUser表对应的类的定义可能如下:

 

public class tblUser : TableMapping
{
#region 字段信息

#region UserID
private string _UserID;
/// <summary>
///标识列:否,类型:varchar,长度:50,精度:50,小数位数:0,是否可为空:否,默认值:,字段说明:
/// </summary>
[PrimaryKeyFieldAttribute("UserID", false)]
public string FPK_UserID
{
set { SetValueFields_Add(FN_UserID); _UserID = value; }
get { return _UserID; }
}
#endregion

#region Pwd
private string _Pwd;
/// <summary>
///标识列:否,类型:varchar,长度:50,精度:50,小数位数:0,是否可为空:否,默认值:,字段说明:
/// </summary>
[CommonFieldAttribute("Pwd", false)]
public string FI_Pwd
{
set { SetValueFields_Add(FN_Pwd); _Pwd = value; }
get { return _Pwd; }
}
#endregion

#region UserName
private string _UserName;
/// <summary>
///标识列:否,类型:varchar,长度:50,精度:50,小数位数:0,是否可为空:是,默认值:,字段说明:
/// </summary>
[CommonFieldAttribute("UserName", false)]
public string FI_UserName
{
set { SetValueFields_Add(FN_UserName); _UserName = value; }
get { return _UserName; }
}
#endregion

#region CreateDate
private DateTime _CreateDate;
/// <summary>
///标识列:否,类型:datetime,长度:8,精度:23,小数位数:3,是否可为空:是,默认值:(getdate()),字段说明:
/// </summary>
[CommonFieldAttribute("CreateDate", false)]
public DateTime FI_CreateDate
{
set { SetValueFields_Add(FN_CreateDate); _CreateDate = value; }
get { return _CreateDate; }
}
#endregion

#endregion

}

 

现在网页前端传过来一个json字符串{"UserID":"haaaaaa55","Pwd":"34a2342155","UserName":"aaaaa","CreateDate":"2016-10-11"}用于增加user,如何把它自动映射到上面那个类中呢?用反射就可以做到。首先定义一个泛型方法,该方法通过反射获取泛型实例的属性名字和类型,并通过SetValue方法对泛型实例赋值。

/// <summary>
/// 实体类
/// </summary>
public T Entity<T>(string json) where T : new()
{

if (string.IsNullOrEmpty(json)) return new T();
else
{
JObject jo = (JObject)JsonConvert.DeserializeObject(Json.jsonEntity);//Newtonsoft.Json.Linq.JObject
T t = new T(); //实例化一个泛型对象
foreach (PropertyInfo pi in t.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) //通过反射获取类型的所有字段属性
{
string name = pi.Name;//获得属性的名字,后面就可以根据名字判断来进行些自己想要的操作
if (name.StartsWith("FI_"))
{
string FiledName = name.Substring(3);
if (jo.Property(FiledName) != null && jo.Property(FiledName).ToString() != "")
{
pi.SetValue(t,Convert.ChangeType(jo[FiledName].ToString(), pi.PropertyType), null);//根据属性类型自动转换和赋值
}

}
else if (name.StartsWith("FPK_"))
{
string FiledName = name.Substring(4);
if (jo.Property(FiledName) != null && jo.Property(FiledName).ToString() != "")
{
pi.SetValue(t,Convert.ChangeType(jo[FiledName].ToString(), pi.PropertyType), null);//根据属性类型自动转换和赋值

}
}

}
return t;

}
}


然后通过调用这个泛型方法即可实现ORM赋值了。

 

tblUser tbl=Entity<tblUser>(json);


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  orm 数据库 编程 c# 泛型