2015-06-07 67 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))