C# 比较GetValue反射方法中的两个值
我得到的C# 比较GetValue反射方法中的两个值,c#,reflection,C#,Reflection,我得到的value1和value2都是零,当它们应该相同时,它们不相等 我还可以如何比较这两个对象的值 private bool CheckProjectIsUnique( TBR.Domain.Project project, List<UniqueProjectType> types, out UniqueProjectType uniqueCandidate) { uniqueCandidate = CreateUniqueProjectType
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;
}
private bool checkprojectsunique(
TBR.Domain.Project项目,
列表类型,
输出唯一项目类型(唯一候选人)
{
uniqueCandidate=CreateUniqueProjectType(项目);
如果(types.Count==0)
返回true;
foreach(类型中的UniqueProjectType)
{
布尔存在=真;
foreach(type.GetType().GetProperties()中的PropertyInfo属性)
{
var value1=prop.GetValue(类型,null);
var value2=prop.GetValue(uniqueCandidate,null);
如果(值1!=值2)
{
存在=假;
打破
}
}
如果(存在)
返回true;
}
返回false;
}
它们是对象,因此应使用value1.Equals(value2)
检查value1
是否为null
编辑:更好:使用静态
对象。Equals(value1,value2)
(归功于@LukeH)Equals是从System.Object继承而来的,如果您不提供自己的Equals实现,则无法确保正确比较这两个对象
覆盖System.Object.Equals和/或在域对象或任何要评估其与另一个对象相等性的对象中实现IEquatable
阅读本文了解更多信息:
if(value1!=value2)
交换为if(!object.Equals(value1,value2))
,您应该准备好了
=您当前使用的代码>运算符是非虚拟的,并且由于GetValue
调用的编译时类型是object
,因此您将始终测试引用(in)是否相等
使用静态方法首先测试引用是否相等,如果对象不相同,则引用将遵循虚拟方法。如果属性的类型是值类型(例如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
}
}
或者使用静态对象.Equals(value1,value2)
方法,该方法将为您处理空值检查。OP使用非多态=对象
上的code>运算符,因此不管您是否重写
Equals或实现IEquatable,OP的代码都在测试引用是否相等。但他正在尝试评估值1和值2是否相等。这不是关于推荐信,是吗DOr如果我错了,那么他需要写一个更好的问题,因为他需要指定他是否想要一个引用或值相等。