2012-01-27 146 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