2016-07-12 12 views
0

2つのオブジェクトをパラメータとして取り、オブジェクト内のすべてのプロパティを比較してその差異を返す汎用メソッドを作成しようとしています。今私はこれをリフレクションを使って実装しています。これは単純なプロパティ(int、string ....)でうまく動作します。リストとiEnumeableのようなネストされた複雑なプロパティを持つオブジェクト監査の一般的なメソッド

しかし、リストや配列などの複雑なデータ型については、追加または削除されたリストの要素数を追跡する必要があります。私は以下のコードを使用して同じことを理解しようとしていますが、複雑な型には固執しています。

各ループで、それは私にオブジェクトタイプのnewItemとOldItemを与えます。他の操作を実行できません。

IEnumerable型のプロパティから追加または削除された項目を見つけるには、解決策が必要です。

今後の進め方はありがたいです。

ありがとうございます!ジェネリックコレクションにリフレクションを使用:

private static string GenerateAuditLogMessage<T>(T oldObject, T newObject) 
    { 
     PropertyInfo[] properties = typeof(T).GetProperties(); 
     foreach (PropertyInfo pi in properties) 
     { 
      object oldValue = pi.GetValue(oldObject), newValue = pi.GetValue(newObject); 

      if (pi.PropertyType.IsGenericType && typeof(IEnumerable).IsAssignableFrom(pi.PropertyType)) 
      { 
       Type type = oldValue.GetType().GetGenericArguments()[0]; 
       foreach (var oldItem in (IEnumerable)oldValue) 
       { 
        foreach (var newItem in (IEnumerable)newValue) 
        { 
         var propertyResult = GenerateAuditLogMessage<object>(oldObject, newObject); 
         if (string.IsNullOrEmpty(propertyResult)) 
         { 
          // newItem. 
         } 
        } 
       } 
       /* Need something like below commented line.*/ 
       // var added = newValue.Except(oldValue) 
       // var removed = oldValue.Except(newValue); 
      } 
      else 
      { 
       if (!object.Equals(oldValue, newValue)) 
       { 
        //.... 
       } 
      } 
     } 

     return string.Empty; 
    } 
+0

タプルを参照してください...理由が助けになる場合は、なぜインターフェイスを使用しないでください – Jay

+0

以下のリンクを参照してください。便利です.... http://stackoverflow.com/questions/5636438/difference-between-two-lists –

+0

[CompareNETObjects](https://www.nuget.org/packages/CompareNETObjects/)ライブラリを使用 – thepirat000

答えて

0

これは古い事前ジェネリックSystem.Collections.*インタフェースはまだのために使用されている一つのことです。

あなたはなどSystem.Collections.IEnumerableに任意の汎用System.Collections.Generic.IEnumerable<T>System.Collections.IListへのSystem.Collections.Generic.IList<T>は、その後、あなたはどのような方法でそれらをループ彼らはサポートすることができますキャストすることができます。

あなたはすでに同じタイプのコレクションであることを確認するために既にo.GetType().GetGenericArguments()を呼び出しています。そうであれば、非ジェネリックコレクションインターフェイスを介してコレクション内のオブジェクトを取得できます。オブジェクトを取得したら、もちろん、ただ再帰します。

+0

申し訳ありませんが間違っている投稿、私はそのOPのために意味した。 – Jay

+0

@Jay NP、歓声 –

関連する問題