我得到value1
和value2
,当它们应该相同时,它们都是零并且不相等。
我还能比较这两个对象的值吗?
private bool CheckProjectIsUnique(
TBR.Domain.Project project,
List<UniqueProjectType> types,
out UniqueProjectType uniqueCandidate)
{
uniqueCandidate = CreateUniqueProjectType(project);
if (types.Count == 0)
return true;
foreach (UniqueProjectType type in types)
{
bool exists = true;
foreach (PropertyInfo prop in type.GetType().GetProperties())
{
var value1 = prop.GetValue(type, null);
var value2 = prop.GetValue(uniqueCandidate, null);
if (value1 != value2)
{
exists = false;
break;
}
}
if (exists)
return true;
}
return false;
}
答案 0 :(得分:11)
它们是对象,因此您应该使用value1.Equals(value2)
检查value1
是否null
编辑:更好:使用静态Object.Equals(value1, value2)
(@LukeH的积分)
答案 1 :(得分:4)
Equals继承自System.Object,如果您不提供自己的Equals实现,它将无法确保正确比较两个对象。
覆盖System.Object.Equals和/或在您的域对象中实现IEquatable<T>
或您想要评估与另一个对象相等的任何对象。
了解更多内容阅读本文:
答案 2 :(得分:2)
为if (value1 != value2)
交换if (!object.Equals(value1, value2))
,你应该好好去。
您当前使用的!=
运算符是非虚拟运算符,并且由于GetValue
调用的编译时类型为object
,因此您将始终进行测试以供参考(不)平等。
首先使用静态object.Equals(x,y)
方法测试参考相等性,如果对象不是相同的参考,则将遵循虚拟Equals
方法。
答案 3 :(得分:1)
如果属性的类型是值类型(例如int),则GetValue返回的值将被装箱到对象中。然后==
将比较这些盒装值的引用。如果要进行正确的比较,则应使用Equals方法:
class Program
{
class Test
{
public int A { get; set; }
}
static void Main(string[] args)
{
var testA = new Test { A = 1 };
var testB = new Test { A = 1 };
var propertyInfo = typeof(Test).GetProperties().Where(p => p.Name == "A").Single();
var valueA = propertyInfo.GetValue(testA, null);
var valueB = propertyInfo.GetValue(testB, null);
var result = valueA == valueB; // False
var resultEquals = valueA.Equals(valueB); // True
}
}