通过泛型获得对象的差异

时间:2012-01-27 19:49:58

标签: c# c#-4.0

我正在尝试使用泛型来提高自己,但实际上我不知道如何开始这项任务:

我需要构建一个记录两个带日志的表的方法。这个方法将收到两个相同类型的对象,然后我需要对它们进行比较。

将使用对象的名称记录第一个表。

第二个表将收到以下数据:第一个表记录ID,字段名称,旧值和新值。

我需要使用泛型来构建,因为我有很多不同的对象,而且我确信为每个想要记录这些信息的对象构建任何类型的switch case都会很痛苦和奇怪。

我希望你们能帮助我!

1 个答案:

答案 0 :(得分:1)

除非这些对象共享一个公共接口,否则你必须使用反射来获取对象的属性,然后遍历它们并比较objectA和objectB之间的值。像这样:

public void CompareTwoObjectsAndSaveChanges<TObjectType>(TObjectType objectA, TObjectType objectB )
    {
        //makes sure both objects match in Type
        if(objectA.GetType() == objectB.GetType())
        {
           //uses reflection to get all the properties of that object.
           foreach (var prop in objectA.GetType().GetProperties())
           {
               //checks to see if the value is different
               if(prop.GetValue(objectA, null) != prop.GetValue(objectB, null))
               {
                   //get the property name and its two different values
                   string nameOfPropertyThatChanges = prop.Name;
                   string objectAValue = prop.GetValue(objectA, null).ToString();
                   string objectBValue = prop.GetValue(objectB, null).ToString();

                   //logic to save to database
               }
           }   
        }
    }

您必须在数据库中将oldValue和newValue列设置为varchar或nvarchar,并在保存之前将所有属性值转换为字符串,否则您无法按照要求执行操作。从技术上讲,你甚至不必在这里使用泛型,因为两个参数都可以简单地获取一个对象,并且反射仍然可以工作,因为两个对象都是相同的类型。这里的泛型参数只是让它更干净,并确保调用此方法的人不会意外地传入两个不同类型的对象。

编辑:要获取第一个表格的对象名称,您可以这样做:

typeof(TObjectType).ToString();