Click here to Skip to main content
Licence CPOL
First Posted 11 Nov 2008
Views 11,081
Bookmarked 11 times

Compare Objects for Any Change in Value

By | 11 Nov 2008 | Article
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

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Vikramaditya S Shekhawat

Architect

India India

Member

Originally from Jaipur(Rajasthan).
Working in Norway for a Software company.Holding diploma from CDAC and MCSD.NET (C#).

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionHow to compare html files and show diffrences? Pinmembernidjain15:27 23 Aug '09  
GeneralMy vote of 1 PinmemberJeffrey Schaefer8:06 16 Jun '09  
GeneralCompare .NET Objects PinmemberGreg Finzer6:30 1 Jun '09  
QuestionTest code properly before submitting. PinmemberMS_Jocker16:35 11 Mar '09  
GeneralFaulty logic PinmemberMKauffman6:34 11 Nov '08  
The check for (type.IsSealed == true && type.IsGenericType == false) is not sufficient to determine whether the type is primitive. I can create a sealed class that is not generic, but not override the Equals method. In this case, your method would not return the desired results. Use Type.IsPrimitive instead.

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120604.1 | Last Updated 11 Nov 2008
Article Copyright 2008 by Vikramaditya S Shekhawat
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid