您的位置:首页 > 编程语言 > C#

C#对于任意对象进行深度值比较

2013-03-01 15:23 369 查看
说明:

本文使用VS2010,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

对于List,Dictionary类型,也是对每一个item进行深度值比较(DeepValueCompare)。

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

入口函数,两个参数,两个要比较的对象。

采用递归,代码比较简单,直接上代码:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: