[英]C# Reflection Property.GetValue() Problem
我对以下代码有疑问:
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映射模型对象是否有效。 如果我为每个属性都使用编写此代码的麻烦方法:
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,布尔值也将返回false。请参见所附图片。
任何帮助,将不胜感激!
多谢你们。
蒂姆。
编辑:可以给你所有的答案。 很高兴最后很简单。 非常感谢你的帮助。 干杯。
您需要与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
您正在通过引用与不同的装箱整数进行比较。
更改为
if (!Equals(cinf.GetValue(client, null), vinf.GetValue(viewModel, null))
这将调用static
Object.Equals
方法 ,该方法将调用virtual
Object.Equals
方法 (在检查null
)以按值比较对象。
您会看到相同的字符串问题。
这是自然的。 如果使用==一起比较对象,它将比较它们的引用不同。
使用objectA.Equals(objectB)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.