2015-05-29 58 views
0

我有方法更新類的屬性,然後使用Web服務更新數據庫中的對象。我想通過拉動新對象並將其與內存中的對象進行比較來驗證更新是否成功。確定兩個類中的所有屬性是否相等

是否需要比較每個屬性,或者這將決定它們是否具有相同的所有屬性值?

var areEqual = objectThatHasChanges.Equals(objectSavedToDatabase); 
+0

你要比較的類或對象?它聽起來像你正在比較兩個對象 – 2015-05-29 11:16:24

+0

[Object.Equals文檔](https://msdn.microsoft.com/en-us/library/bsc2ak47%28v=vs.110%29.aspx),它的確是你的決定多少你需要比較以決定什麼是足夠的。你確定你需要這樣做嗎?這聽起來像它可能是非常昂貴的 – Sayse

+0

對象是實體,我想只是通過每個屬性,並比較每一個,但如果我可以做到一條線,它做同樣的事情,那麼爲什麼不。 –

回答

3

您需要比較每個屬性。如果這些是兩個參考型對象equals方法將只使用默認等於執行將檢查對象是同一實例: https://msdn.microsoft.com/en-us/library/bsc2ak47(v=vs.110).aspx

如果當前實例是引用類型,的Equals(Object)方法 測試引用相等,並且調用Equals(Object)方法 相當於調用了ReferenceEquals方法。參考 相等意味着被比較的對象變量指的是同一個對象的 。以下示例說明了這種 的比較結果。它定義了一個Person類,它是一個引用類型, 並調用Person類構造函數來實例化具有相同值的兩個新Person Person1a和Person2對象,person1a和person2。它也 將person1a分配給另一個對象變量person1b。由於示例中的輸出 顯示,person1a和person1b相等,因爲它們 引用相同的對象。然而,person1a和person2並不是 ,儘管它們具有相同的值。

您應該重載「等於」的方法,寫你自己的哪個比較每個或鑰匙性質(如最後修改日期,修改等),或者你應該寫這將需要這兩個對象的方法和比較他們。

如果你在不同的對象中有很多字段,你可以編寫通用的方法,它使用反射遍歷對象中的所有屬性,並與其他對象進行比較。當然,首先檢查兩個對象是否屬於同一類型。

1

如果你真的想檢查是否更新成功然後做這樣的東西:

string query = @"UPDATE [Entities] SET [Value] = [Value] + 1"; 

// SQL initialization 

return (sqlCommand.ExecuteNonQuery() > 0); 

ExecuteNonQuery返回受影響的\插入的行數。因此,積極的結果意味着更新成功。

如果由於某種原因,想從服務器獲取實體更新後,然後用下面的辦法:

string query = @"UPDATE [Entities] SET [Value] = [Value] + 1; 
SELECT * FROM [Entities] WHERE [Id] = SCOPE_IDENTITY()" 

// SQL initialization 

var reader = sqlCommand.ExecuteReader(); 
while (reader.Read()) 
{ 
    // Object initialization 
} 

這些方法都是在便利性和性能方面更好。

1

如果屬性名相同,這或多或少是微不足道的:

private static bool IsEqual(Model1 model, Model2 model2) 
{ 
    long changes = 0; 

    foreach (var pi in typeof(Model1).GetProperties(BindingFlags.Instance | BindingFlags.Public)) 
    { 
    var secondModelPi = typeof(Model2).GetProperty(pi.Name, BindingFlags.Instance | BindingFlags.Public); 
    if (secondModelPi != null) 
    { 
     if (!pi.GetValue(model).Equals(secondModelPi.GetValue(model2))) 
     { 
     changes++; 
     } 
    } 
    } 

    return changes == 0; 
} 
相關問題