C#反射属性.GetValue()问题
我对以下代码有问题:C#反射属性.GetValue()问题,c#,reflection,C#,Reflection,我对以下代码有问题: 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))
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,bool也会返回false。见附图
在此方面的任何帮助都将不胜感激
谢谢各位
蒂姆
编辑:本可以给你所有的答案。很高兴最后很简单。非常感谢你的帮助。干杯。您正在通过引用比较不同的装箱整数 换成
if (!Equals(cinf.GetValue(client, null), vinf.GetValue(viewModel, null))
这将调用静态
,它将调用虚拟
(在检查null
)以按值比较对象
字符串也会遇到同样的问题。您需要与
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
csharp>对象a=1;
csharp>对象b=1;
csharp>a==b;
假的
csharp>object.Equals(a,b);
这是很自然的。如果使用==将对象一起比较,则会比较它们的不同引用
使用objectA.Equals(objectB)
为什么不调用object.Equals
?是clientVal
和viewModelVal
类型的object
?如果是这样,那么您的相等性比较就是比较装箱版本,它应该是false
。当objectA
为null时,这将失败,出现异常。当然,我假设您之前检查过,我是否需要提一下??