曾经看《大话设计模式》的时候说到 反射反射程序员的欢乐,当时我还不太相信 毕竟自己不太会反射。甚至什么时候用反射我也不太知道,只能说查了些资料知道有一些反射这咱东西仅此而已。
这几天在做一个人才管理系统,其中有一个让我纠结的就是 操作日志这块吧,特别是在修改的时候要记录每个字段改变前后的情况。好吧,当时有两个决定方案吧。一、再建了一张和原表相同的结构的呗,再用一个外键和原表主键连下,做下记录吧。二、就是在读取数据的时候存储两个Model,一个New Model 一个Old Model呗,然后再对比下。
最后,由于种种的原因选择了第二次方式。好吧,竟然用第二种说出来一个问题,怎么对比两个Model来,难道一个个字段对比吗?天哪这不噩梦嘛,如果有20个字段我不是要写20多个对比 20多个IF了,这我不干 这明显就不是最良的代码好,不过我也没什么好的办法 只能问问度娘、GOOOGLE呗,在这个互联网的时代,要善用搜索引擎嘛,于是找了下。
一开始代码应该是这样的。有两个实体变量,存放的是修改前和修改后的信息。比如:
InfoModel oldModel=new InfoModel(); InfoModel newModel=new InfoModel();
需要遍历这两个实体类的全部属性的值来进行对比,并将有差别的列出来。
找到一个解决的方案就是使用反射进行对比
//反射遍历 System.Reflection.PropertyInfo[] mPi = typeof(InfoModel).GetProperties(); for (int i = 0; i < mPi.Length; i++) { System.Reflection.PropertyInfo pi = mPi[i]; oldValue = pi.GetValue(oldModel, null).ToString(); newValue = pi.GetValue(newModel, null).ToString(); if (oldValue !=newValue ) { 有差别的列出来 } } }