Click here to Skip to main content
15,888,610 members
Articles / Programming Languages / C#

Compare Objects for Any Change in Value

Rate me:
Please Sign up or sign in to vote.
1.50/5 (15 votes)
11 Nov 2008CPOL 21.9K   11   5
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:

C#
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)


Written By
Architect
Norway Norway
Growing up with the world wide web, witnessing many bubbles and the rise of information technology to becoming an indispensable part of human existence, I was intrigued and astonished by the drastic changes it brought to the way we lived then. I was drawn into this whirlpool of internet and technology as an enthusiast only to come out as a qualified software professional. Worked extensively on technologies, starting with Visual Basic, ASP, Oracle and MS SQL to WCF, .NET Core , Azure service fabric and Kubernetes. Architected applications for on-premises to hybrid clouds to cloud native environments.
Fortunately, I like what I do and work has been fulfilling.
It has been 20+ years of working for various organisations in several roles both technical and managerial but not a
dull day.

Comments and Discussions

 
QuestionHow to compare html files and show diffrences? Pin
nidjain23-Aug-09 15:27
nidjain23-Aug-09 15:27 
GeneralMy vote of 1 Pin
Jeffrey Schaefer16-Jun-09 8:06
Jeffrey Schaefer16-Jun-09 8:06 
GeneralCompare .NET Objects Pin
Greg Finzer1-Jun-09 6:30
Greg Finzer1-Jun-09 6:30 
QuestionTest code properly before submitting. Pin
shyam_11-Mar-09 16:35
shyam_11-Mar-09 16:35 
GeneralFaulty logic Pin
MKauffman11-Nov-08 6:34
MKauffman11-Nov-08 6:34 

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

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