C#Reflection Property.GetValue()问题

时间:2011-01-18 23:09:54

标签: 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))
        {
            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。参见附图。

alt text

非常感谢任何帮助!

谢谢你们。

编辑:可以给你所有的答案。很高兴最后这很简单。非常感谢你的帮助。欢呼声。

3 个答案:

答案 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)