プロジェクト内のクラスのインスタンスを比較する汎用オブジェクト比較メソッドを実装しています。各クラスには、いくつかの値型変数と、その関連クラスのバインディングリストがあります。値型変数では、==
演算子または演算子を使用して比較できますが、バインディングリストでは、それをキャストして反復し、再帰を実行するequal
方法がわかりません。bindinglist<type of associate class>
public bool IsEqual<T>(T obj1, T obj2)
{
PropertyInfo[] prop1 = obj1.GetType().GetProperties();
PropertyInfo[] prop2 = obj2.GetType().GetProperties();
for(int i = 0; i < prop1.Count; i++)
{
if(prop1[i].IsValueType && prop2[i].IsValueType)
{
if(prop1.GetValue(i) != prop2.GetValue(i))
return false
}
else
{
//This is bindinglist of associate class
//I need to cast it to iterate in perform recursion here
}
}
return true
}
では、プロパティがバインディング リストの場合、再帰を実装するにはどうすればよいでしょうか。
P/S: 下手な英語を許して
アップデート:
慎重に検討した結果IEqualtable
、Stephen Hewlett 氏の提案どおりに実装しました。スティーブン・ヒューレットさん、どうもありがとうございました。それでも比較機能を使いたい人のために、うまくいくと思うアプローチを紹介します。
public bool IsEqual(Object obj1, Object obj2)
{
PropertyInfo[] prop1 = obj1.GetType().GetProperties();
PropertyInfo[] prop2 = obj2.GetType().GetProperties();
for(int i = 0; i < prop1.Count; i++)
{
if(prop1[i].IsValueType && prop2[i].IsValueType)
{
if(prop1[i].GetValue(obj1, null) != prop2[i].GetValue(obj2, null))
return false;
}
else if (prop1[i].PropertyType.IsGenericType && prop2[i].PropertyType.IsGenericType) //if property is a generic list
{
//Get actual type of property
Type type = prop1[i].PropertyType;
//Cast property into type
var list1 = Convert.ChangeType(prop1[i].GetValue(obj1, null), type);
var list2 = Convert.ChangeType(prop1[i].GetValue(obj2, null), type);
if (list1.count != list2.count)
return false;
for j as integer = 0 to list1.Count - 1
{
//Recursion here
if (!IsEqual(list1(j), list2(j)))
{
return false;
}
}
}
else //if property is instance of a class
{
Type type = prop1[i].PropertyType;
Object object1 = Convert.ChangeType(prop1[i].GetValue(obj1, null), type);
Object object2 = Convert.ChangeType(prop1[i].GetValue(obj2, null), type);
//Recursion
if(!IsEqual(object1, object2))
{
return false;
}
}
}
return true;
}