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;
}
タプルを参照してください...理由が助けになる場合は、なぜインターフェイスを使用しないでください – Jay
以下のリンクを参照してください。便利です.... http://stackoverflow.com/questions/5636438/difference-between-two-lists –
[CompareNETObjects](https://www.nuget.org/packages/CompareNETObjects/)ライブラリを使用 – thepirat000