c# 反射在ORM中的应用
2017-05-10 20:51
225 查看
ORM给数据库编程带来了极大的便利和灵活性,实现ORM一般需要用到反射,本文介绍c# 反射在ORM中的应用。
在ORM编程中,一般把表或视图映射为一个类,把字段作为属性来使用,从数据库表或视图读取的数据需要映射到类的属性中,在更新数据库时也要读取类的属性的值,通过反射就能做到这些。
假设主键字段在类中加上FPK_前缀来命名,其它字段加上FI_前缀来命名,那么tblUser表对应的类的定义可能如下:
现在网页前端传过来一个json字符串{"UserID":"haaaaaa55","Pwd":"34a2342155","UserName":"aaaaa","CreateDate":"2016-10-11"}用于增加user,如何把它自动映射到上面那个类中呢?用反射就可以做到。首先定义一个泛型方法,该方法通过反射获取泛型实例的属性名字和类型,并通过SetValue方法对泛型实例赋值。
然后通过调用这个泛型方法即可实现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);
相关文章推荐
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C# ORM 泛型与反射的交叉应用 - 更新表中除了主键的所有数据
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#:反射以及Attribute在ORM中的应用
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#:反射以及Attribute在ORM中的应用
- C#:反射以及Attribute在ORM中的应用 [转载]
- C#:反射以及Attribute在ORM中的应用
- C#反射之基础应用
- C#反射之基础应用
- C#反射在实际应用中的事例代码
- C# 反射应用实例-获取当前Color类的所有颜色
- C# 根据反射和特性实现ORM 映射[学习]
- 【原创】 ASP.NET C#反射简单实例应用
- 转载:实现自己的ORM(反射以及Attribute在ORM中的应用)
- “反射”在C#编程中的应用
- C#反射的一点应用
- C# 反射技术应用
- C#反射之基础应用