c# 反射在ORM中的应用

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);



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值