比较C#中的数据类型

时间:2015-06-07 09:48:02

标签: c# compare

我想比较两个类的数据类型并返回bool值。问题是我的方法不比较类的类

中的值

以下是代码:

<?php 

use WordPress\ORM\Model\BookingModel;
class Bookings extends Backend
{
    function __construct()
    {
        parent::__construct(new BookingModel());
    } 

    // ...

}

?>

以下是比较:

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;
    }
}

res

返回的值为false

2 个答案:

答案 0 :(得分:1)

当你比较Obj2的两个实例时,如果它们是同一个对象,它们将是相等的。

要执行结构相等,您需要通过所有引用类型(即类)进行递归,只需直接比较值类型(即结构,默认使用结构相等)。注意int等是值类型。

我建议检查覆盖Equals的类型,实现IEquatable<T>IComparable<T>等:所有类型都有相同定义的指示。

答案 1 :(得分: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))