2011-01-18 4 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); 

これは問題なく動作します。

問題は次のとおりです。リフレクションコードは、「val1!= val2」文が正しくない(またはそう思われる)かどうかを評価します。このコードをステップ実行すると、基本的に "1は1と等しくない"と表示され、誤ってエラーが追加されます。コード、clientVal = 1とviewModelVal = 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を返す:私はこのコードでこれをテストする場合はさらに、私は同じ一見偽結果を得ます。

alt text

これで任意の助けいただければ幸いです!

ありがとうございます。

Tim。

編集:あなたにすべての答えを与えてもらえますか?最後はシンプルだったのがうれしい。助けてくれてありがとう。乾杯。

+0

'client'型と' viewModelVal'型は 'object'ですか?もしそうなら、あなたの等価比較はboxed版を比較しています。これは 'false'でなければなりません。 –

答えて

3

参照平等を使用する代わりにobject.Equals()と比較する必要があります。ボックス化された値のタイプは、object.Equals()を使用せずに等しいとは比較されません。このお試しください:これは自然なことです

csharp> object a = 1; 
csharp> object b = 1; 
csharp> a == b; 
false 
csharp> object.Equals(a, b); 
true
+0

なぜ 'object.Equals'を呼び出さないのですか? – SLaks

+0

@SLaks:決して使用していません...回答が更新されました。 – cdhowie

1

あなたは、参照によって異なるボックス化された整数と比較しています。

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

に変更し、それをこの値でオブジェクトを比較する(nullのためにチェックした後)virtualObject.Equals methodを呼び出しますstaticObject.Equals methodを呼び出します。

文字列でも同じ問題が発生します。

1

:たとえば

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

を、この単純なケースを取ります。 ==を使用してオブジェクトを比較すると、異なる参照が比較されます。

objectA.Equals(objectB)を使用してください。

+1

これは、 'objectA'がヌルの場合に例外を伴い失敗します。 – cdhowie

+1

確かに、私はそれを前にチェックしていると思いますが、それについても言及する必要がありますか? – Aliostad