2012-01-27 147 views
0

对象获取的差异我想用仿制药,以提高自己,但实际上我不知道如何甚至开始这项任务:从仿制药

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

第一个表格会记录下对象的名称。

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

我需要这是泛型建立,因为我有很多不同的对象,我相信那将是痛苦的,怪异的建立任何形式的开关盒的,我要记录这些信息的每个对象。

我希望你们帮助我!

回答

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(); 
+1

除非他真的要验证objectA.GetType()== objectB.GetType()和使用对象A .GetType()。GetProperties(),这样你就可以检查所有运行时数据上的数据,而不仅仅是编译时。因为如果在编译时将对象转换为(System.Object),它将不会检查任何相关的属性。 – 2012-01-27 21:08:55

+0

好点先生。 – SventoryMang 2012-01-27 21:40:23

+0

感谢您的回应!我试试这个! – 2012-02-02 12:19:57