Tengo una clase con muchas propiedades. Una copia superficial es suficiente para replicar completamente el objeto.Comparando las propiedades de dos objetos simplemente en C#
Necesito comparar un objeto solo para comprobar si contiene exactamente los mismos valores que otro.
Mis ideas:
La primera y más obvia solución es sólo para crear un enorme bloque método que compara cada propiedad, una después de la otra.
El segundo sería serializar cada objeto y cortar el archivo o hacer algún tipo de suma de comprobación md5 en él. (¿Esto realmente funcionaría)?
El tercero es hacer algún tipo de reflexión sobre el objeto, lo que automatizaría la primera opción, pero crearía un nivel adicional de complejidad.
La velocidad no es realmente un problema.
Interesado en escuchar el pensamiento, o cualquier otro método que me falta para hacer tal cosa.
Edit: Gracias a todos. Mi solución: (Modificado para ahora ser recursivo en artículos genéricos).
public static bool IsSame<T>(T objA, T objB)
{
var type = typeof(T);
var properties = type.GetProperties();
foreach (var pi in properties.Where(a => a.CanRead))
{
if (pi.Name == "Item")
{
var piCount = properties.FirstOrDefault(a => a.Name == "Count");
int count = -1;
if (piCount != null && piCount.PropertyType == typeof(System.Int32))
count = (int)piCount.GetValue(objA, null);
if (count > 0)
{
for (int i = 0; i < count; i++)
{
dynamic child1 = pi.GetValue(objA, new object[] { i });
dynamic child2 = pi.GetValue(objB, new object[] { i });
return IsSame(child1, child2);
}
}
}
else
{
var val1 = type.GetProperty(pi.Name).GetValue(objA, null);
var val2 = type.GetProperty(pi.Name).GetValue(objB, null);
if (val1 != val2 && (val1 == null || !val1.Equals(val2)))
return false;
}
}
return true;
}
iría con la reflexión a menos que la estructura de la clase no sea propensa a cambiar. si * no * cambia, elegiría la primera solución (fácil de leer, fácil de mantener) – Alex
http://stackoverflow.com/questions/506096/comparing-object-properties-in-c-sharp there's solución usando reflexión. – Giedrius