You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PropertyInfo.GetValue获取int属性值比较始终为false的问题咨询

解决int属性比较始终返回false的问题

嘿,我明白你遇到的麻烦了!字符串属性比较正常,但int属性不管值相同与否都返回false,这大概率是因为装箱后的引用比较 vs 值类型的值比较的问题,咱们一步步来解决它。

问题根源

当你通过PropertyInfo.GetValue()获取int属性值时,值类型的int会被自动装箱成object类型。如果直接用==来比较这两个装箱后的对象,C#会默认做引用比较——哪怕两个int的值相同,只要它们是不同的装箱实例,==就会返回false。而字符串虽然也是引用类型,但它重写了==运算符,会做值比较,所以你看不到这个问题。

解决方案:类型安全的通用比较方法

最稳妥的方式是使用EqualityComparer<T>.Default来做比较,它会根据属性的实际类型自动选择正确的比较逻辑(值类型比内容,引用类型默认比引用,重写了Equals的类型用重写后的逻辑)。

先看你的测试类示例:

public class TestClass
{
    public string StringProp1 { get; set; }
    public string StringProp2 { get; set; }
    public int IntProp { get; set; }
}

然后是修正后的比较方法:

public bool CompareTestClassInstances(TestClass obj1, TestClass obj2)
{
    if (obj1 == null || obj2 == null)
        return obj1 == obj2; // 处理null情况

    // 获取所有公共实例属性
    var properties = typeof(TestClass).GetProperties(BindingFlags.Public | BindingFlags.Instance);
    
    foreach (var prop in properties)
    {
        var value1 = prop.GetValue(obj1);
        var value2 = prop.GetValue(obj2);

        // 创建对应属性类型的EqualityComparer
        var comparerType = typeof(EqualityComparer<>).MakeGenericType(prop.PropertyType);
        var defaultComparer = (IEqualityComparer)comparerType.GetProperty("Default").GetValue(null);

        // 使用Comparer做类型安全的比较
        if (!defaultComparer.Equals(value1, value2))
        {
            return false;
        }
    }

    return true;
}

简化的针对性处理(如果只针对int)

如果你只需要处理int属性的特殊情况,也可以直接把装箱后的object转换回int再比较:

public bool CompareTestClassInstances(TestClass obj1, TestClass obj2)
{
    if (obj1 == null || obj2 == null)
        return obj1 == obj2;

    var properties = typeof(TestClass).GetProperties(BindingFlags.Public | BindingFlags.Instance);
    
    foreach (var prop in properties)
    {
        var value1 = prop.GetValue(obj1);
        var value2 = prop.GetValue(obj2);

        if (prop.PropertyType == typeof(int))
        {
            // 强制转换为int后做值比较
            int intVal1 = (int)value1;
            int intVal2 = (int)value2;
            if (intVal1 != intVal2)
                return false;
        }
        else
        {
            // 其他类型用object.Equals处理(字符串也能正确比较)
            if (!object.Equals(value1, value2))
                return false;
        }
    }

    return true;
}

为什么这个方法有效?

  • EqualityComparer<T>.Default会针对不同类型选择最优的比较逻辑:对于值类型(比如int),它会直接比较值;对于引用类型(比如string),会使用类型重写的Equals方法。
  • 直接转换为int后比较,绕开了装箱后的引用比较问题,直接做值类型的内容对比。

内容的提问来源于stack exchange,提问作者marcelo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:08:40