比较c#中的数据类型

本文关键字:数据类型 比较 | 更新日期: 2023-09-27 17:54:06

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

中的值

代码如下:

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

比较c#中的数据类型

返回值为false

当你比较Obj2的两个实例时,只有当它们是相同的对象时,它们才相等。

要执行结构相等,您需要递归遍历所有引用类型(例如:类),只是直接比较值类型(即。结构,默认情况下使用结构相等)。注int等为值类型。

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

在您的代码中,obj1。Obj2和obj11。obj2不同,比较方法使用Object。等于比较类的成员,这就是为什么要使用compare。PublicInstancePropertiesEqual方法返回false。

。:其中obj1。Obj2 = Obj2;但obj11。Obj2 = obj22;

如果要递归比较值,应该替换

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

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