我遇到以下代码的问题:
int errorCount = 0;
foreach (var cinf in client.GetType().GetProperties())
{
var vinf = viewModel.GetType().GetProperty(cinf.Name);
if (vinf != null)
{
if (cinf.GetValue(client, null) != vinf.GetValue(viewModel, null))
{
errorCount++;
}
}
}
这是一个自动化测试,用于查看从DTO映射模型对象是否有效。如果我为每个属性使用更麻烦的approch:
Assert.AreEqual(viewModel.ClientCompanyID, client.ClientCompanyID);
这很好用。
问题是:反射代码错误地评估“if val1!= val2”语句(或者看起来如此)。如果我单步执行此代码,评估基本上会说“1不等于1”,并错误地添加错误。此外,如果我用这段代码测试它,我会得到同样看似错误的结果:
var clientEx = client.GetType().GetProperty("ClientCompanyID");
var viewModelEx = viewModel.GetType().GetProperty("ClientCompanyID");
var clientVal = clientEx.GetValue(client, null);
var viewModelVal = viewModelEx.GetValue(viewModel, null);
bool test = (clientVal == viewModelVal);
即使单步执行代码,clientVal = 1和viewModelVal = 1,bool也会返回false。参见附图。
非常感谢任何帮助!
谢谢你们。
添
编辑:可以给你所有的答案。很高兴最后这很简单。非常感谢你的帮助。欢呼声。答案 0 :(得分:3)
您需要与object.Equals()
进行比较,而不是使用引用相等性。如果不使用object.Equals()
,盒装值类型将不会相等。试试这个:
if (!object.Equals(cinf.GetValue(client, null), vinf.GetValue(viewModel, null)))
例如,举个简单的例子:
csharp> object a = 1; csharp> object b = 1; csharp> a == b; false csharp> object.Equals(a, b); true
答案 1 :(得分:1)
您通过引用比较了不同的盒装整数。
将其更改为
if (!Equals(cinf.GetValue(client, null), vinf.GetValue(viewModel, null))
这会调用static
Object.Equals
method,它会调用virtual
Object.Equals
method(在检查null
之后)按值比较对象。
你会看到字符串的相同问题。
答案 2 :(得分:1)
这很自然。如果使用==将对象与对象进行比较,则会比较它们不同的引用。
使用objectA.Equals(objectB)
。