プロパティを比較したい複雑なオブジェクトがいくつかあります。次のコードは、コレクションに到達するまではうまく機能します。コレクションの各メンバーで関数を再帰的に呼び出したいと思います。HasPropertyChanged を再度呼び出すことができるように、誰かがコレクション内のオブジェクトのタイプを判断するのを手伝ってくれませんか?
この疑似コードは私の意図を示しています
if (p.GetType() == typeof(System.Collections.Generic.List<>))
{
foreach (var blah in //the list)
{
HasPropertyChanged<//TheType>(Type obj1, Type obj2, null);
}
}
また、コードのこの部分は私を悩ませます。tostring メソッドを呼び出さないと、id 63633 が 63633 と等しくないなど、奇妙な結果が得られます。
object val1 = Original.GetType().GetProperty(p.Name).GetValue(Original, null);
object val2 = Modified.GetType().GetProperty(p.Name).GetValue(Modified, null);
if (!IgnoreProperties.Contains(p.Name) &&
val1 != null && val2 != null &&
val1.ToString() != val2.ToString())
{
return true;
}
こちらがその全貌です。
private bool HasPropertyChanged<T>(T Original, T Modified, string[] IgnoreProperties)
{
if (Original == null || Modified == null)
return false;
if (IgnoreProperties == null)
IgnoreProperties = new string[] { };
IEnumerable<PropertyInfo> properties = typeof(T).GetProperties();
foreach (var p in properties)
{
if (p.GetType() == typeof(System.Collections.Generic.List<>))
{
foreach (var blah in //the list)
{
HasPropertyChanged<//TheType>(Type obj1, Type obj2, null);
}
}
object val1 = Original.GetType().GetProperty(p.Name).GetValue(Original, null);
object val2 = Modified.GetType().GetProperty(p.Name).GetValue(Modified, null);
if (!IgnoreProperties.Contains(p.Name) &&
val1 != null && val2 != null &&
val1.ToString() != val2.ToString())
{
return true;
}
}
return false;
}