繁体   English   中英

C#反射Property.GetValue()问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM