C#中批量修改 利用反射原理

学习MVC时遇到批量修改  于是看到资料关于如下:

UI代码:

P05MODEL.User uModify = new P05MODEL.User() { uName = "AAA", uAddtime = DateTime.Now };//需要修改model中的两个字段  uNname和uAddtime
                bll.ModifyBy(uModify, u => u.uIsDel == true,"uName","uAddtime");   //调用批量修改

讲解:调用修改类变量讲解:

/// <param name="model">要修改的实体对象</param>
/// <param name="proNames">要修改的 属性 名称</param>

ModifyBy(P05MODEL.User model, Expression<Func<P05MODEL.User,bool>> whereLambda,params string[] modifiedProNames)

                      对应修改的model                     用于查询那些数据修改                                                     修改那些字段

DAL代码:

public int ModifyBy(P05MODEL.User model, Expression<Func<P05MODEL.User,bool>> whereLambda,params string[] modifiedProNames)
        {
            //4.1查询要修改的数据
            List<P05MODEL.User> listModifing = db.Users.Where(whereLambda).ToList();

            //获取 实体类 类型对象
            Type t = typeof(P05MODEL.User); // model.GetType();
            //获取 实体类 所有的 公有属性
            List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();
            //创建 实体属性 字典集合
            Dictionary<string, PropertyInfo> dictPros = new Dictionary<string, PropertyInfo>();
            //将 实体属性 中要修改的属性名 添加到 字典集合中 键:属性名  值:属性对象
            proInfos.ForEach(p => {
                if (modifiedProNames.Contains(p.Name))
                {
                    dictPros.Add(p.Name, p);
                }
            });

            //4.3循环 要修改的属性名
            foreach (string proName in modifiedProNames)
            {
                //判断 要修改的属性名是否在 实体类的属性集合中存在
                if (dictPros.ContainsKey(proName))
                {
                    //如果存在,则取出要修改的 属性对象
                    PropertyInfo proInfo = dictPros[proName];
                    //取出 要修改的值
                    object newValue = proInfo.GetValue(model, null); //object newValue = model.uName;

                    //4.4批量设置 要修改 对象的 属性
                    foreach (P05MODEL.User usrO in listModifing)
                    {
                        //为 要修改的对象 的 要修改的属性 设置新的值
                        proInfo.SetValue(usrO, newValue, null); //usrO.uName = newValue;
                    }
                }
            }
            //4.4一次性 生成sql语句到数据库执行
            return db.SaveChanges();
        }

步骤如下:

  1。通过whereLambda刷选到需要修改的数据存放到listModifing中

  2。因为通过model并不知道那些字段数据需要进行了修改 所以通过model 获取 实体类 类型对象 再通过 获取 实体类 所有的 公有属性

    最后放入字典中:将 实体属性 中要修改的属性名 添加到 字典集合中 键:属性名  值:属性对象

  3。通过遍历反射形式把需要修改的对象中的字段一 一修改

 

原文地址:https://www.cnblogs.com/xiaoyangshu/p/12284828.html