2011-01-18 535 views
2

我有以下代碼中的問題:C#反射Property.GetValue()問題

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); 

的布爾返回false,即使通過代碼,clientVal = 1和viewModelVal = 1步進見附圖。

alt text

任何幫助,將不勝感激!

謝謝你們。

Tim。

編輯:可以給你所有的答案。很高興它最終很簡單。非常感謝你的幫助。乾杯。

+0

「object」類型的`clientVal`和`viewModelVal`?如果是這樣,那麼你的平等比較是比較盒裝版本,這應該是'假'。 – 2011-01-18 23:14:41

回答

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
+0

爲什麼不調用`object.Equals`? – SLaks 2011-01-18 23:13:14

+0

@SLaks:從未使用過......答案已更新。 – cdhowie 2011-01-18 23:13:56

1

你正在通過引用比較不同的盒裝整數。

將其更改爲

if (!Equals(cinf.GetValue(client, null), vinf.GetValue(viewModel, null)) 

這將調用staticObject.Equals method,這將調用virtualObject.Equals method按值來比較對象(null檢查後)。

您會看到字符串的相同問題。

1

這是很自然的。如果你使用==比較對象,它會比較它們的參考,這是不同的。

使用objectA.Equals(objectB)