在开发过程中,我们会遇到这样一个问题,编辑了一个对象之后,我们想要把这个对象修改了哪些内容保存下来,以便将来查看和追责。
首先我们要创建一个User类
1 public class User
2 {
3 private string name;
4 public string Name
5 {
6 get { return name; }
7 set { name = value; }
8 }
9 private string age;
10 public string Age
11 {
12 get { return age; }
13 set { age = value; }
14 }
15 private string sex;
16 public string Sex
17 {
18 get { return sex; }
19 set { sex = value; }
20 }
21 }
复制代码
然后在Main函数中声明并初始化一个User对象
1 User userA = new User()
2 {
3 Name = "李四",
4 Age = "25",
5 Sex = "男",
6 };
复制代码
因为要对比对象编辑前后的内容,所以需要备份一下这个UserA,我们来个深拷贝
1 User userB = DeepCopyByXml(userA);
复制代码
1 ///
2 /// 深拷贝
3 ///
4 ///
5 ///
6 ///
7 public static T DeepCopyByXml(T obj) where T : class
8 {
9 object retval;
10 using (MemoryStream ms = new MemoryStream())
11 {
12 XmlSerializer xml = new XmlSerializer(typeof(T));
13 xml.Serialize(ms, obj);
14 ms.Seek(0, SeekOrigin.Begin);
15 retval = xml.Deserialize(ms);
16 ms.Close();
17 }
18 return (T)retval;
19 }
复制代码
接下来的工作是修改UserA的属性,然后和UserB对比,利用反射来实现该功能
///
/// Model对比
///
///
///
///
private static void CompareModel(T oldModel, T newModel) where T : class
{
string changeStr = string.Empty;
PropertyInfo[] properties = oldModel.GetType().GetProperties();
Console.WriteLine("--------用户信息修改汇总--------");
foreach (System.Reflection.PropertyInfo item in properties)
{string name = item.Name;
object oldValue = item.GetValue(oldModel);
object newValue = item.GetValue(newModel);
if (!oldValue.Equals(newValue))
{
Console.WriteLine(name + " :由[" + oldValue + "] 改为 [" + newValue + "]");
}
}
}
复制代码
![](http://img.it-home.org/data/attachment/forum/2018pic1/823082-20180422102035169-548397528.png)
从运行结果来看我们已经获取到了修改的内容,美中不足的是“Name”和“Age”,如何以中文显示属性名,接下来将利用C#的特性来实现
新建一个自定义的特性类TableAttribute
/*
参数 validon 规定特性可被放置的语言元素。它是枚举器 AttributeTargets 的值的组合。默认值是 AttributeTargets.All。
参数 allowmultiple(可选的)为该特性的 AllowMultiple 属性(property)提供一个布尔值。如果为 true,则该特性是多用的。默认值是 false(单用的)。
参数 inherited(可选的)为该特性的 Inherited 属性(property)提供一个布尔值。如果为 true,则该特性可被派生类继承。默认值是 false(不被继承)。
*/
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Field |
AttributeTargets.Property,
AllowMultiple = false,
Inherited = false)]
public class TableAttribute : System.Attribute
{
private string fieldName;
private string tableName;
///
/// 表名
///
public string TableName
{
get { return tableName; }
set { tableName = value; }
}
///
/// 字段名
///
public string FieldName
{
get { return fieldName; }
set { fieldName = value; }
}
}
复制代码
接着修改User类,加上自定义的特性TableAttribute
///
/// 用户信息实体类
///
[TableAttribute(TableName = "用户信息")]
public class User
{
private string name;
[TableAttribute(FieldName = "姓名")]
public string Name
{
get { return name; }
set { name = value; }
}
private string age;
[TableAttribute(FieldName = "年龄")]
public string Age
{
get { return age; }
set { age = value; }
}
private string sex;
[TableAttribute(FieldName = "性别")]
public string Sex
{
get { return sex; }
set { sex = value; }
}
}
复制代码
最后修改一下CompareModel这个方法
1 ///
2 /// Model对比
3 ///
4 ///
5 ///
6 ///
7 private static void CompareModel(T oldModel, T newModel) where T : class
8 {
9 string changeStr = string.Empty;
10 PropertyInfo[] properties = oldModel.GetType().GetProperties();
11 Console.WriteLine("--------用户信息修改汇总--------");
12 foreach (System.Reflection.PropertyInfo item in properties)
13 {
14 TableAttribute tableAttribute = item.GetCustomAttribute();
15 string name = item.Name;
16 if (tableAttribute != null)
17 name = tableAttribute.FieldName;
18 object oldValue = item.GetValue(oldModel);
19 object newValue = item.GetValue(newModel);
20 if (!oldValue.Equals(newValue))
21 {
22 Console.WriteLine(name + " :由[" + oldValue + "] 改为 [" + newValue + "]");
23 }
24 }
25 }
复制代码(编辑:雷林鹏 来源:网络)