2015-06-07 70 views
-1

我想比較兩個類的數據類型並返回bool值。問題是我的方法不中類的類在C中比較數據類型#

這裏的比較值是代碼:

public static class Compare 
{ 
    public static bool PublicInstancePropertiesEqual<T>(this T self, T to, params string[] ignore) where T : class 
    { 
     if (self != null && to != null) 
     { 
      var type = typeof(T); 
      var ignoreList = new List<string>(ignore); 
      var unequalProperties = 
       from pi in type.GetProperties(BindingFlags.Public | BindingFlags.Instance) 
       where !ignoreList.Contains(pi.Name) 
       let selfValue = type.GetProperty(pi.Name).GetValue(self, null) 
       let toValue = type.GetProperty(pi.Name).GetValue(to, null) 
       where selfValue != toValue && (selfValue == null || !selfValue.Equals(toValue)) 
       select selfValue; 
      return !unequalProperties.Any(); 
     } 
     return self == to; 
    } 
} 

這裏是比較:

private void Form1_Load(object sender, EventArgs e) 
    { 
     Obj1 obj1 = new Obj1(); 
     Obj1 obj11 = new Obj1(); 
     Obj2 obj2 = new Obj2(); 
     Obj2 obj22 = new Obj2(); 

     obj1.param1 = "1"; 
     obj1.param2 = "2"; 

     obj2.param3 = "3"; 
     obj1.obj2 = obj2; 

     obj11.param1 = "1"; 
     obj11.param2 = "2"; 
     obj22.param3 = "3"; 
     obj11.obj2 = obj22; 
     bool res = Compare.PublicInstancePropertiesEqual(obj1, obj11, ("secure")); 

    } 
} 
class Obj1 
{ 
    public string param1 { get; set; } 
    public string param2 { get; set; } 
    public Obj2 obj2 { get; set; } 
} 
class Obj2 
{ 
    public string param3 { get; set; } 
    public decimal param4 { get; set; } 

} 

返回的值是假的res

+1

你有沒有調試,看看它爲什麼不起作用? – Patrick

+0

您應該調用您自己的PublicInstancePropertiesEqual方法,而不是調用selfValue.Equals(toValue),當然您需要在這種情況下爲值類型添加一些檢查 – Patrick

+0

手動測試每個屬性,以查看哪個比較失敗。那麼對於該屬性,測試比較條件的三個部分中的每一部分以查看哪一個是真或假。 – HugoRune

回答

1

當你比較兩個Obj2的實例時,它們只會是相同的,如果它們是同一個對象的話。

要執行結構相等性,您需要通過所有引用類型(即類)進行遞歸,直接比較值類型(即缺省使用結構相等的結構)。注int等是值類型。

我會建議檢查覆蓋的類型Equals,執行IEquatable<T>,IComparable<T>等:所有的跡象表明,類型有自己的定義相等。

0

在您的代碼中,obj1.obj2和obj11.obj2的值不同,比較方法使用Object.Equals比較類的成員,這就是爲什麼Compare.PublicInstancePropertiesEqual方法返回false。

I.e .: obj1.obj2 = obj2;但obj11.obj2 = obj22;

如果你想遞歸的比較值,則應更換線

where selfValue != toValue && (selfValue == null || !selfValue.Equals(toValue)) 

where selfValue != toValue && (selfValue == null || !PublicInstancePropertiesEqual(selfValue, toValue, ignore))