反射+序列化+泛型=变更记录实例
来源:互联网 发布:mac拷贝视频到iphone 编辑:程序博客网 时间:2024/06/05 10:32
变更记录,是通过变更前是实体和变更后的实体进行比较后,如有变更记录,就记录到变更表里面。
1、序列化实体:
1)需要在.net framework 4.0:右击MODel层选择属性。
2)添加引用:
3)实体类代码设置:
注意: [Display(Name = “人员ID”)]是为了记录变更字段的中文名称。
2,核心代码两个实体进行比较,用泛型实体记录变更的每个字段,然后保存到变更表。:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Reflection;using System.ComponentModel.DataAnnotations;namespace Tlw.zjxypj.Common{ public static class ChangeRecordUnity { /// <summary> /// 获取修改后的model,获取现在的model,对比model,获得差异 /// </summary> /// <param name="modelAfter"></param> /// <param name="modelBefore"></param> /// <remarks>比对必须是相同的实体类</remarks> public static List<ChangeInfo> getChanges(object modelAfter, object modelBefore) { List<ChangeInfo> lisChangeInfos = new List<ChangeInfo>(); Type t = modelAfter.GetType(); PropertyInfo[] pInfoArr = t.GetProperties(); //Dictionary<string, string> dicChangeList = new Dictionary<string, string>(); foreach (PropertyInfo pi in pInfoArr) //遍历值 { object objAfter = pi.GetValue(modelAfter, null);//修改后值 object objBefore = pi.GetValue(modelBefore, null);//修改前值 string pValueAfter = objAfter != null ? objAfter.ToString().Trim() : "";//修改后值 string pValueBefore = objBefore != null ? objBefore.ToString().Trim() : "";//修改前值 if (pValueAfter != pValueBefore) //比对 { //获取修改信息 string aliasName = ""; object[] pAttribute = pi.GetCustomAttributes(typeof(DisplayAttribute), false); if (pAttribute.Count() > 0) { aliasName = ((DisplayAttribute)pAttribute[0]).Name; } //dicChangeList.Add(pi.Name,string.Format("{0} 从'{1}'更改为'{2}'",string.IsNullOrEmpty(aliasName)?pi.Name:aliasName,pValueBefore,pValueAfter)); ChangeInfo pChangeInfo = new ChangeInfo(); pChangeInfo.ColumnName = pi.Name; pChangeInfo.ColumnAliasName = string.IsNullOrEmpty(aliasName) ? pi.Name : aliasName;//变更小类:具体字段的中文名称 pChangeInfo.AfterValue = pValueAfter; pChangeInfo.BeforeValue = pValueBefore; lisChangeInfos.Add(pChangeInfo); } } //return dicChangeList; return lisChangeInfos; } } /// <summary> /// 变更信息 /// </summary> public class ChangeInfo { /// <summary> /// 变更字段 /// </summary> // //变更小类:具体字段名称 public string ColumnName { get; set; } //变更小类:具体字段的中文名称 public string ColumnAliasName { get; set; } //变更后 public string AfterValue { get; set; } //变更前 public string BeforeValue { get; set; } } }
3、调用:
//获取详细改变信息 List<ChangeInfo> lisChangeInfos = ChangeRecordUnity.getChanges(model, modelBefore); if (lisChangeInfos.Count > 0) { for (int i = 0; i < lisChangeInfos.Count; i++) { zjbaksys.Model.CHANGELOG pModel = new zjbaksys.Model.CHANGELOG(); pModel.ID = DbHelperOra.GetSEQ("SEQ_CHANGELOG"); pModel.APPCHECKID = decimal.Parse(pCheckid); pModel.ENTERPRISEID = ENTERPRISEID; pModel.TYPE = "技术负责人信息"; pModel.SUBTYPE = lisChangeInfos[i].ColumnName; pModel.SUBALIASNAME = lisChangeInfos[i].ColumnAliasName; pModel.AFTERVALUE = lisChangeInfos[i].AfterValue; pModel.BEFOREVALUE = lisChangeInfos[i].BeforeValue; pModel.OPERATION = "修改"; pModel.UNIQUENAME = modelBefore.PERSONNAME.Trim(); pModel.SUBMITTIME = System.DateTime.Now; listLog.Add(pModel); } }
4、变更记录表:
1 0
- 反射+序列化+泛型=变更记录实例
- 反射与序列化
- 反射和序列化
- 反射和序列化
- javacore 序列化&反射
- Java反射实例 自己用于记录
- FFmpeg API 变更记录
- Hibernate数据变更记录
- FFmpeg API 变更记录
- FFmpeg API 变更记录
- git变更记录
- 单例模式(多线程不安全,序列化不安全,反射不安全实例)
- 什么是反射,什么序列化?
- 什么是反射?什么是序列化
- 记录:Java序列化
- 泛型+反射 List<任意类型>序列化+反序列化
- 序列化实例
- Serializable序列化实例
- c语言不同类型返回数组长度用法
- Sublime text 2/3 中 Package Control 的安装与使用方法
- 关于安卓6.0无法查找蓝牙设备的问题
- 设计一个移动应用的本地缓存机制
- 移动开发博客
- 反射+序列化+泛型=变更记录实例
- 面试系列之HashMap原理
- 4、Container Extension Points(spring容器的扩展)
- MySQL管理之FLUSH语句
- 携程Docker实践
- Leetcode 102. Binary Tree Level Order Traversal
- AsyncTask源码分析之Java篇
- CheckBox 自定义
- 梯度下降的矩阵分解公式推导