public static string CompareModelToLog <T>(LogModule action, T newObj, T oldObj = null) where T : class { var result = string.Empty; if (oldObj == null) { result = string.Format("成功添加{0}!", action.ToString()); var props = typeof(T).GetProperties(); var idprop = props.FirstOrDefault(o => o.Name.ToUpper() == "ID"); var id = idprop.GetValue(newObj, null); result += string.Format("{0}Id:{1}{2}", Environment.NewLine, id, Environment.NewLine); foreach (var item in props) { var attr = item.GetCustomAttributes(typeof(OperationLogAttribute), true).FirstOrDefault(); if (attr != null) { var attrObj = (attr as OperationLogAttribute); object value = item.GetValue(newObj, null); if (attrObj.IsDict) { switch (attrObj.Source) { case DictSource.InDBSysDict: SysDataDictionaryDAL _dal = new SysDataDictionaryDAL(); _dal.GetExtModelByDicSN((int)value); break; case DictSource.Prop: var titleProp = props.FirstOrDefault(o => o.Name == attrObj.Prop); if (titleProp != null) { value = titleProp.GetValue(newObj, null); } break; case DictSource.Enum: var enumtitle = attrObj.ShowDicts.FirstOrDefault(o => o.Contains(value.ToString().ToLower() + ":")); if (enumtitle != null) { value = enumtitle.Split(':')[1]; } break; } } result += string.Format("{0}:{1},", attrObj.Title, value); } } //new } else if (newObj != null && oldObj != null) { result = string.Format("成功修改{0}!", action.ToString()); var props = typeof(T).GetProperties(); var idprop = props.FirstOrDefault(o => o.Name.ToUpper() == "ID"); var id = idprop.GetValue(newObj, null); result += string.Format("{0}Id:{1}{2}", Environment.NewLine, id, Environment.NewLine); foreach (var item in props) { var attr = item.GetCustomAttributes(typeof(OperationLogAttribute), true).FirstOrDefault(); if (attr != null) { var attrObj = (attr as OperationLogAttribute); object value = item.GetValue(newObj, null); object oldValue = item.GetValue(oldObj, null); bool isEquals = false; if (value == null) { isEquals = value != oldValue; } else { isEquals = !value.Equals(oldValue); } if (isEquals) { if (attrObj.IsDict) { switch (attrObj.Source) { case DictSource.InDBSysDict: SysDataDictionaryDAL _dal = new SysDataDictionaryDAL(); _dal.GetExtModelByDicSN((int)value); break; case DictSource.Prop: var titleProp = props.FirstOrDefault(o => o.Name == attrObj.Prop); if (titleProp != null) { value = titleProp.GetValue(newObj, null); } break; case DictSource.Enum: var enumtitle = attrObj.ShowDicts.FirstOrDefault(o => o.Contains(value.ToString().ToLower() + ":")); if (enumtitle != null) { value = enumtitle.Split(':')[1]; } break; } } result += string.Format("{0}:{1},", attrObj.Title, value); } } } //update } else { result = string.Format("成功删除{0}!", action.ToString()); var props = typeof(T).GetProperties(); var idprop = props.FirstOrDefault(o => o.Name.ToUpper() == "ID"); var id = idprop.GetValue(oldObj, null); result += string.Format("{0}Id:{1}{2}", Environment.NewLine, id, Environment.NewLine); foreach (var item in props) { var attr = item.GetCustomAttributes(typeof(OperationLogAttribute), true).FirstOrDefault(); if (attr != null) { var attrObj = (attr as OperationLogAttribute); object value = item.GetValue(oldObj, null); if (attrObj.IsDict) { switch (attrObj.Source) { case DictSource.InDBSysDict: SysDataDictionaryDAL _dal = new SysDataDictionaryDAL(); _dal.GetExtModelByDicSN((int)value); break; case DictSource.Prop: var titleProp = props.FirstOrDefault(o => o.Name == attrObj.Prop); if (titleProp != null) { value = titleProp.GetValue(oldObj, null); } break; case DictSource.Enum: var enumtitle = attrObj.ShowDicts.FirstOrDefault(o => o.Contains(value.ToString().ToLower() + ":")); if (enumtitle != null) { value = enumtitle.Split(':')[1]; } break; } } result += string.Format("{0}:{1},", attrObj.Title, value); } } } return(result); }