Compare Objects for Any Change in Value






1.50/5 (13 votes)
Compare object members to the deepest thread for any value change
Introduction
Object comparison has always been a topic of debate. There are lot of ways to implement it, using comparer interface and implementing it, etc. But there is no generic way by which two similar objects of any type/class can be compared for the change in value of any of the members.
Using the Code
Just implement the below mentioned methods in a class of your own:
private static string CompareObjects(object initialObj, object currentObj)
{
string returnMessage = string.Empty;
Type type = initialObj.GetType();
Type type2 = currentObj.GetType();
PropertyInfo[] propListInfo = type.GetProperties();
PropertyInfo[] propListInfo1 = type2.GetProperties();
//if class type is native i.e. string, int, boolean, etc.
if (type.IsSealed == true && type.IsGenericType == false)
{
if (!initialObj.Equals(currentObj))
{
returnMessage = "initialObj value :{" + initialObj.ToString() + "},
currentObj value :{" + currentObj.ToString() + "}";
}
}
else //class type is object
{
//loop through each property of object
for (int count = 0; count < propListInfo.Length; count++)
{
//check if it is an indexed object -- special case
if (propListInfo[count].GetGetMethod().GetParameters().Length > 0)
{
// check if not dict object --dict object needs to be addressed
if (count > 1 && type.Name.IndexOf("Dictionary") == -1)
{
int indexersTotal = 0;
//get index of count
for (int tmpCount = 0; tmpCount < propListInfo.Length; tmpCount++)
{
if (propListInfo[tmpCount].Name == "Count")
{
indexersTotal = (int)propListInfo[tmpCount].GetValue(
initialObj, null);
break;
}
}
//indexersTotal =
// (int)propListInfo[count - 1].GetValue(initialObj, null);
try
{
for (int curIndex = 0; curIndex < indexersTotal; curIndex++)
{
object Obj1 = propListInfo[count].GetValue(initialObj,
new object[] { curIndex });
object Obj2 = propListInfo1[count].GetValue(currentObj,
new object[] { curIndex });
returnMessage = Compare(Obj1, Obj2);
if (returnMessage.Length > 0)
{
return returnMessage + " " +
propListInfo[count].ToString();
}
}
}
catch (Exception ex)
{
//consume this error as it is occurred because of dictionary
//setting collection
string str = ex.Message;
}
}
}
else //not an indexed object
{
object Obj1 = propListInfo[count].GetValue(initialObj, null);
object Obj2 = propListInfo1[count].GetValue(currentObj, null);
returnMessage = Compare(Obj1, Obj2);
if (returnMessage.Length > 0)
{
return returnMessage + " " + propListInfo[count].ToString();
}
}
}
}
public static string Compare(object initialObj, object currentObj)
{
string returnMessage = "";
if (initialObj == null && currentObj != null)
{
returnMessage = "initialObj is Null Object";
}
else if (initialObj != null && currentObj == null)
{
returnMessage = "currentObj is Null Object";
}
else if (initialObj != null && currentObj != null)
{
returnMessage = CompareObjects(initialObj, currentObj);
}
return returnMessage;
}
History
- 11th November, 2008: Initial post