public override Boolean Equals(Object obj) { ComparableObject compareTo = obj as ComparableObject; if (ReferenceEquals(this, compareTo)) { return(true); } return(compareTo != null && this.GetType().Equals(compareTo.GetTypeUnproxied()) && this.HasSameObjectSignatureAs(compareTo)); }
/// <summary> /// Se puede hacer un override de este método para proporcionar una rutina de comparación propia. /// </summary> protected virtual Boolean HasSameObjectSignatureAs(ComparableObject compareTo) { IEnumerable <PropertyInfo> signatureProperties = this.GetSignatureProperties(); // Se comparan los valores de las propiedades que conforman la firma del objeto entre esta instancia y compareTo, // si alguno de los valores no coincide se devuelve false. if ((from property in signatureProperties let valueOfThisObject = property.GetValue(this) let valueToCompareTo = property.GetValue(compareTo) where valueOfThisObject != null || valueToCompareTo != null where (valueOfThisObject == null ^ valueToCompareTo == null) || (!valueOfThisObject.Equals(valueToCompareTo)) select valueOfThisObject).Any()) { return(false); } // Si se llegó a este punto y se encontraron propiedades que conforman la firma, entonces podemos // asumir que todo ha emparejado (es igual); en el caso contrario, si no se encontraron propiedades // que conformen la firma del objeto, simplemente se utiliza el comportamiento por defecto de Equals. return(signatureProperties.Any() || base.Equals(compareTo)); }