How to create comparer class with reflection?
I want to create the comparer class which compare two objects in generalized way. Means it will check the fields, properties, objects, list of objects within the two of objects. I have created the code which compare the two objects with its public properties and fields. But want to add it with comparing objects (and list of objects) within given input objects.
public static class Comparer<T>
{
/// <summary>
/// Comparer method formcomparing two objects
/// </summary>
/// <param name="x">Object x of type T</param>
/// <param name="y">Object y of type T</param>
/// <returns>int value 0/1</returns>
public static int Compare(T x, T y)
{
Type type = typeof(T);
//Collecting public properties and fields
PropertyInfo[] properties = type.GetProperties();
FieldInfo[] fields = type.GetFields();
int compareValue = 0;
// Loop for comparing one by one properties values of two objects.
foreach (PropertyInfo property in properties)
{
IComparable valx = property.GetValue(x, null) as IComparable;
if (valx == null)
continue;
开发者_开发百科 object valy = property.GetValue(y, null);
compareValue = valx.CompareTo(valy);
if (compareValue != 0)
return compareValue;
}
// Loop for comparing one by one fields values of two objects.
foreach (FieldInfo field in fields)
{
IComparable valx = field.GetValue(x) as IComparable;
if (valx == null)
continue;
object valy = field.GetValue(y);
compareValue = valx.CompareTo(valy);
if (compareValue != 0)
return compareValue;
}
return compareValue;
}
/// <summary>
/// Comparer method for comparing to list objects
/// </summary>
/// <param name="x">List object of T type</param>
/// <param name="y">List object of T type</param>
/// <returns>Result of comparision as true/false</returns>
public static bool Compare(List<T> x, List<T> y)
{
// Checking input lists as a null.
if (x == null || y == null)
{
return false;
}
// Checking input lists count is equal or not.
if (x.Count() != y.Count())
{
return false;
}
// Loop that invoke compare method for each of list objects.
for (int iCntr = 0; iCntr < x.Count(); iCntr++)
{
int result = Compare(x[iCntr], y[iCntr]);
if (result != 0)
{
return false;
}
}
return true;
}
}
Have you any idea to solve the problem?? Please reply me if you find any ref about it.
Regards, Girish
You need to use recursion for every property found.
Pseudocode
public static int Compare(object x, object y)
{
... handle if one or both are null
... handle if both same type
if (IsArray(x))
{
?? equal also means same order??
for i=0 to min(x.lenght, y.length)-1 {
int subcompareresult = Compare(x[i], y[i])
if subcompareresult != 0
return subcompareresult // difference found
}
// elements compared so far are same
... handle different length
} else if IsClass(x)
foreach subproperty in x.Properties
int subcompareresult = Compare(x[subproperty ], y[subproperty ])
if subcompareresult != 0
return subcompareresult // difference found
else
... handle value compare
Note the recursive call to Compare of the subitems within array and class.
You can have a look at the SharpSerializer sourcecode. SharpSerializer serializes object graphs to xml or binary format. The part with the recursive traversal can be found in SharpSerializer/.../PropertyFactory.cs
精彩评论