2011-02-09 15 views

答えて

145

一つの柔軟なソリューション:あなたはすべてのプロパティを列挙していると等しくないかを判断するためにリフレクションを使用することができ、その後、いくつかのプロパティリストとの両方の異なる値を返します。

ここに、あなたが求めているものの良いスタートであるいくつかのコードの例があります。今はフィールド値だけを見ていますが、リフレクションを通してチェックするために他のコンポーネントをいくつでも追加することができます。すべてのオブジェクトがそれを使用できるように、拡張メソッドを使用して実装されています。

を知るために使用することができ

class SomeCustomClass 
    { 
     public int x = 12; 
     public int y = 13; 
    } 

と肉とジャガイモ

using System.Collections.Generic; 
using System.Reflection; 

static class extentions 
{ 
    public static List<Variance> DetailedCompare<T>(this T val1, T val2) 
    { 
     List<Variance> variances = new List<Variance>(); 
     FieldInfo[] fi = val1.GetType().GetFields(); 
     foreach (FieldInfo f in fi) 
     { 
      Variance v = new Variance(); 
      v.Prop = f.Name; 
      v.valA = f.GetValue(val1); 
      v.valB = f.GetValue(val2); 
      if (!v.valA.Equals(v.valB)) 
       variances.Add(v); 

     } 
     return variances; 
    } 


} 
class Variance 
{ 
    public string Prop { get; set; } 
    public object valA { get; set; } 
    public object valB { get; set; } 
} 
+50

+1「肉とポテト」 – Kehlan

+17

if(!v.valA.Equals(v.valB))の代わりにif(!Equals(v.valA、v.valB))を使用するとNullExceptionを防ぐことができます – Jerome2606

+0

オートプロパティ? –

10

Equals方法とIEquatable<T>インターフェースと比較する

SomeCustomClass a = new SomeCustomClass(); 
    SomeCustomClass b = new SomeCustomClass(); 
    a.x = 100; 
    List<Variance> rt = a.DetailedCompare(b); 

私のサンプルクラスを使用します2つのオブジェクトが等しいが、あなたが知ることができない場合オブジェクト間の違い。それぞれのプロパティ値を比較することによって、リフレクションを使用できます。

これらのインスタンスをテキスト形式にシリアル化し、結果の文字列(XML、JSONなど)の違いを比較する方法もあります。

+2

彼は平等テストを探しているわけではないと思いますが、2つのオブジェクトが一致しない理由の集まりです。 – deepee1

+0

確かに、顧客クラス – Rob

+0

@ deepee1、@Robに何が含まれているかわからないので、それは本当に意味をなさないでしょう。私は 'Equals'と' IEquatable 'は違いを見つけることに同意します。この場合、反射を使用することができる。 –

関連する問題