Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#反射属性.GetValue()问题_C#_Reflection - Fatal编程技术网

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时,这将失败,出现异常。当然,我假设您之前检查过,我是否需要提一下??