C#任意のオブジェクトに対する奥行き値の比較
説明:
本明細書ではVS 2010,C#を使用する
任意のオブジェクトについて、任意のタイプの深度値の比較
1.DeepValueCompareArrayは、Arrayの各itemについて深度値比較(DeepValueCompare)を行う必要があります.
2. DeepValueCompareGenericType
リストの場合、Dictionaryタイプも、各itemについて深度値比較(DeepValue Compare)を行う.
3.
DeepValueCompareエントリ関数、2つのパラメータ、2つの比較対象オブジェクト.再帰を採用して、コードは比較的に簡単で、直接コードをつけます:
本明細書ではVS 2010,C#を使用する
任意のオブジェクトについて、任意のタイプの深度値の比較
1.DeepValueCompareArrayは、Arrayの各itemについて深度値比較(DeepValueCompare)を行う必要があります.
private static bool DeepValueCompareArray(Array srcArray, Array comparedArray)
{
if (srcArray.Length != comparedArray.Length)
{
return false;
}
for (int i = 0; i < srcArray.Length; i++)
{
// compare each item
if (DeepValueCompare(srcArray.GetValue(i), comparedArray.GetValue(i)) == false)
{
return false;
}
}
return true;
}
2. DeepValueCompareGenericType
リストの場合、Dictionaryタイプも、各itemについて深度値比較(DeepValue Compare)を行う.
private static bool DeepValueCompareGenericType(object src, object compared)
{
try
{
IList srcList = src as IList;
IList comparedList = compared as IList;
if (srcList.Count != comparedList.Count)
{
return false;
}
for (int i = 0; i < srcList.Count; i++)
{
// compare each object in list
if (DeepValueCompare(srcList[i], comparedList[i]) == false)
{
return false;
}
}
return true;
}
catch (Exception)
{
try
{
IDictionary srcDictionary = src as IDictionary;
IDictionary comparedDictionary = compared as IDictionary;
if (srcDictionary.Count != comparedDictionary.Count)
{
return false;
}
foreach (object o in srcDictionary.Keys)
{
// compare each object in map
if (DeepValueCompare(comparedDictionary[o], srcDictionary[o]) == false)
{
return false;
}
}
return true;
}
catch (Exception)
{
return false;
}
}
}
3.
DeepValueCompareエントリ関数、2つのパラメータ、2つの比較対象オブジェクト.再帰を採用して、コードは比較的に簡単で、直接コードをつけます:
public static bool DeepValueCompare(object srcobj , object compareToObj)
{
if (srcobj == null && compareToObj == null)
{
return true;
}
if (srcobj == null || compareToObj == null)
{
return false;
}
Type srcType = srcobj.GetType();
Type compareToType = compareToObj.GetType();
if (srcType != compareToType)
{
return false;
}
if (srcType.IsValueType)
{
if (srcobj.Equals(compareToObj)) return true;
return false;
}
if (srcType.IsArray)
{
return DeepValueCompareArray(srcobj as Array, compareToObj as Array);
}
else if (srcType.IsGenericType || srcType.FullName == "System.Collections.Hashtable")
{
return DeepValueCompareGenericType(srcobj, compareToObj);
}
else if (srcobj is IComparable)
{
// is object support IComparable interface
if ((srcobj as IComparable).CompareTo(compareToObj) != 0) return false;
return true;
}
else
{
// Find out all fields or properties, do deep compare
BindingFlags bflags = BindingFlags.DeclaredOnly | BindingFlags.Public
| BindingFlags.NonPublic | BindingFlags.Instance;
MemberInfo[] memberCollection = srcType.GetMembers(bflags);
foreach (MemberInfo member in memberCollection)
{
if (member.MemberType == MemberTypes.Field)
{
FieldInfo field = (FieldInfo)member;
if (DeepValueCompare(field.GetValue(srcobj), field.GetValue(compareToObj)) == false)
{
return false;
}
}
else if (member.MemberType == MemberTypes.Property)
{
PropertyInfo property = (PropertyInfo)member;
if (DeepValueCompare(property.GetValue(srcobj, null), property.GetValue(compareToObj, null)) == false)
{
return false;
}
}
}
}
return true;
}