Today I stumbled upon
this code. After adding the code, you can simply compare almost 2 simple / complex objects of same type.
int x = 5;
int y = 5;
XyzClass a = new XyzClass();
XyzClass b = new XyzClass();
// Both of these should return true
bool equals = x.CompareEquals(y);
equals = a.CompareEquals(b);
y=10;
b.Date = DateTime.Now;
b.Str="tester";
// both of these should return false
equals = x.CompareEquals(y);
// this one should return false after finding the first non-equal property
equals = a.CompareEquals(b);
However, I personally like the code in a comment, which is shorter than the original code. So I posted it here, as a quick reminder for you and me whenever we need that
using System.IO;
using System;
using System.Reflection;
class Program
{
static void Main()
{
Console.WriteLine("Hello, World1!");
int x = 5;
int y = 5;
Console.WriteLine(x.CompareEquals(y));
}
}
internal static class CompareEqualsModule
{
public static bool CompareEquals<T>(this T objectFromCompare, T objectToCompare)
{
if (objectFromCompare == null && objectToCompare == null) return true;
Type fromType = objectFromCompare.GetType();
if (fromType.IsPrimitive) return objectFromCompare.Equals(objectToCompare);
if (fromType.FullName.Contains("System.String")) return ((objectFromCompare as string) == (objectToCompare as string));
if (fromType.FullName.Contains("DateTime")) return DateTime.Parse(objectFromCompare.ToString()).Ticks == DateTime.Parse(objectToCompare.ToString()).Ticks;
foreach (PropertyInfo prop in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
Type type = objectFromCompare.GetType().GetProperty(prop.Name).GetValue(objectToCompare, null).GetType();
object dataFromCompare = objectFromCompare.GetType().GetProperty(prop.Name).GetValue(objectFromCompare, null);
object dataToCompare = objectToCompare.GetType().GetProperty(prop.Name).GetValue(objectToCompare, null);
if (CompareEquals(Convert.ChangeType(dataFromCompare, type), Convert.ChangeType(dataToCompare, type)) == false) return false;
}
return true;
}
}
No comments:
Post a Comment