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
相关产品推荐
相关产品推荐

